В MySQL, если вы хотите чтобы прочитать строки перед их обновлением, вы можете сделать блокировку чтения в транзакции:
START TRANSACTION;
SELECT ... FROM tbl WHERE x < 7 FOR UPDATE;
Это приобретает блокировки на соответствующих строках, точно так же, как если бы вы сделали обновление. Поэтому никто больше не может блокировать эти строки до завершения транзакции.
После этого вы можете обновить строки, когда будете приближаться к нему, но все же в одной транзакции.
UPDATE tbl SET x = x + 5 WHERE x < 7;
COMMIT;
Если вы хотите, чтобы сначала обновить строки, а затем прочитать их, вы можете сделать это в другом порядке:
START TRANSACTION;
UPDATE tbl SET x = x + 5 WHERE x < 7;
SELECT ... FROM tbl WHERE x < 7;
COMMIT;
Но, конечно, мог бы выбрать другой набор строк, потому что х изменилось. Любая строка, где x> = 2 или больше, перед UPDATE будет иметь x> = 7 после UDPATE и, следовательно, не будет в результате последующего SELECT.
Весь этот синтаксис является стандартным SQL-99, поэтому он должен работать в любой совместимой реализации SQL. Но не все базы данных реализуют стандарт таким же образом, поэтому обратитесь к документации для используемого вами бренда.
E.g. https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
Другие синтаксисы, такие как RETURNING
и OUTPUT
, не являются стандартными SQL, насколько я знаю.
Примечание для закрытия фей: Пожалуйста, убедитесь, что вы закрыли или объединили это с фактически эквивалентным вопросом, которому не исполнилось 10 лет. – mafu
Сначала выберите ключевые значения из условия Where в таблице temp, обновите, а затем выберите из таблицы temp, соединяющей обновленную таблицу. –
Какая СУБД точно? –