Команда SELECT ... FOR UPDATE

Команда SELECT ... FOR UPDATE используется внутри транзакции для выборки строк с их последующей блокировкой. Заблокированные строки не могут быть изменены другими транзакциями до выполнения COMMIT или ROLLBACK. Это позволяет безопасно работать с данными в конкурентной среде.

Синтаксис

sqlSELECT column_list
FROM table_name
WHERE condition
FOR UPDATE

Таблицы для примеров

accounts
id name balance
1 Ivan 1000
2 Olga 1500
3 Sergey 800

Пример

Давайте рассмотрим работу SELECT ... FOR UPDATE в условиях конкуренции двух транзакций:

Транзакция A блокирует строку с id = 1:

sql-- Транзакция A
START TRANSACTION;

SELECT id, name, balance
FROM accounts
WHERE id = 1
FOR UPDATE;

В это же время транзакция B пытается изменить ту же самую строку:

sql-- Транзакция B
START TRANSACTION;

UPDATE accounts
SET balance = balance + 500
WHERE id = 1;

Запрос UPDATE во второй транзакции будет ожидать завершения первой транзакции, так как строка id = 1 заблокирована.

После фиксации изменений в транзакции A блокировка снимается:

sql-- Транзакция A
COMMIT;

Только после этого транзакция B сможет завершить выполнение UPDATE:

sql-- Транзакция B
COMMIT;

Результат выполнения операций:

id name balance
1 Ivan 1500
2 Olga 1500
3 Sergey 800

Смотрите также

  • команду START TRANSACTION,
    которая включает режим транзакции
  • команду COMMIT,
    которая снимает блокировки после фиксации
  • команду ROLLBACK,
    которая снимает блокировки при откате
  • команду SELECT,
    которая делает выборку данных