Команда SELECT ... FOR UPDATE
Команда SELECT ... FOR UPDATE используется внутри
транзакции для выборки строк с их последующей блокировкой.
Заблокированные строки не могут быть изменены
другими транзакциями до выполнения
COMMIT
или ROLLBACK.
Это позволяет безопасно работать с данными
в конкурентной среде.
Синтаксис
SELECT column_list
FROM table_name
WHERE condition
FOR UPDATE
Таблицы для примеров
| id | name | balance |
|---|---|---|
| 1 | Ivan | 1000 |
| 2 | Olga | 1500 |
| 3 | Sergey | 800 |
Пример
Давайте рассмотрим работу SELECT ... FOR UPDATE в условиях конкуренции двух транзакций:
Транзакция A блокирует строку с id = 1:
-- Транзакция A
START TRANSACTION;
SELECT id, name, balance
FROM accounts
WHERE id = 1
FOR UPDATE;
В это же время транзакция B пытается изменить ту же самую строку:
-- Транзакция B
START TRANSACTION;
UPDATE accounts
SET balance = balance + 500
WHERE id = 1;
Запрос UPDATE во второй транзакции будет ожидать завершения первой транзакции, так как строка id = 1 заблокирована.
После фиксации изменений в транзакции A блокировка снимается:
-- Транзакция A
COMMIT;
Только после этого транзакция B сможет завершить выполнение UPDATE:
-- Транзакция B
COMMIT;
Результат выполнения операций:
| id | name | balance |
|---|---|---|
| 1 | Ivan | 1500 |
| 2 | Olga | 1500 |
| 3 | Sergey | 800 |
Смотрите также
-
команду
START TRANSACTION,
которая включает режим транзакции -
команду
COMMIT,
которая снимает блокировки после фиксации -
команду
ROLLBACK,
которая снимает блокировки при откате -
команду
SELECT,
которая делает выборку данных