как атомарно требовать строки или ресурса с помощью ОБНОВЛЕНИЯ в mysql

у меня есть таблица ресурсов (позволяет, говорят, что автомобили), которого я хочу требовать атомарно. Я затем хочу информацию, о котором ресурсе я просто требовал.

Если существует предел одного ресурса на одного пользователя, я могу сделать следующий прием:

UPDATE cars SET user = 'bob' WHERE user IS NULL LIMIT 1
SELECT * FROM cars WHERE user = 'bob'

Таким образом, я требую ресурса атомарно, и затем я вижу, какой строки я просто требовал.

Это не работает, когда 'боб' может требовать нескольких автомобилей. Я понимаю, что могу получить список автомобилей, уже требуемых бобом, требовать другого, и затем SELECT снова для наблюдения, что изменяется, но это чувствует hackish.

То, что я задаюсь вопросом, там некоторый способ видеть, какие строки я просто обновил со своим ПОСЛЕДНИМ ОБНОВЛЕНИЕМ?

Сбой этого, там некоторый другой прием к атомному требованию строки? Я действительно хочу избегать использования SERIALIZABLE уровень изоляции. Если я делаю что-то вроде этого:

1 SELECT id FROM cars WHERE user IS NULL
2 <here, my PHP or whatever picks a car id>
3 UPDATE cars SET user = 'bob' WHERE id = <the one i picked>

был бы REPEATABLE READ быть достаточными здесь? Другими словами, мне можно было гарантировать это, некоторые другие транзакции не будут требовать строки, которую мое программное обеспечение выбрало во время шага 2?

14
задан Igor Serebryany 17 March 2010 в 12:50
поделиться

3 ответа

UPDATE cars SET user = 'bob' WHERE id = 123 И пользователь РАВЕН NULL;

Запрос на обновление возвращает количество измененных строк. Если он не обновился, вы знаете, что автомобиль уже был востребован кем-то другим.

Кроме того, вы можете использовать SELECT ... ДЛЯ ОБНОВЛЕНИЯ.

11
ответ дан 1 December 2019 в 13:47
поделиться
update cars  
set @id = id, user= 'bob' 
where user is null

гарантированно будет атомарным, а @id сообщит вам, какая строка была последней обновленной.

2
ответ дан 1 December 2019 в 13:47
поделиться

Одна вещь, которую вы можете использовать, это SELECT FOR UPDATE. Это позволит вам выполнить select, узнать, что вы выбрали, а затем обновить эти значения. Блокировка снимается, когда транзакция завершена.

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");

mysqli_autocommit($link, FALSE);

$result = mysqli_query($link, "SELECT id FROM cars WHERE user IS NULL");

// do something with the results

mysqli_query($link, "UPDATE cars SET user = 'bob' WHERE id = <the one that was picked>");

mysqli_commit($link);

mysqli_close($link);
?>
1
ответ дан 1 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: