У меня есть таблица ресурсов (скажем, автомобили), на которые я хочу претендовать атомарно. Затем я хочу получить информацию о том, какой ресурс я только что заявлял.
Если у одного пользователя есть ограничение на один ресурс, я могу сделать следующий трюк:
UPDATE cars SET user = 'bob' WHERE user IS NULL LIMIT 1
SELECT * FROM cars WHERE user = 'bob'
Таким образом, я утверждаю ресурс атомарно, и тогда я могу видеть, какую строку я только что заявил.
Это не работает, когда "bob" может требовать несколько автомобилей. Я понимаю, что могу получить список автомобилей, уже заявленных bob, попросить еще один, а затем SELECT
снова, чтобы увидеть, что изменилось, но это кажется хакерским.
Что мне интересно, есть ли способ увидеть, какие строки я только что обновил с помощью моего последнего UPDATE?
В противном случае, есть ли какой-нибудь другой трюк, чтобы атомически требовать строку? Я действительно хочу избежать использования уровня изоляции 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?