Примеры.
Версия 1.20 от Alexandr Fokin на 2023/12/16 14:01
Необходимый уровень изоляции | Запрос | Комментарий |
Замечание: в приведенных ниже примерах не рассматриваются сценарии с использованием Оптимистичная блокировка. | ||
READ COMMITTED | BEGIN; UPDATE accounts SET balance = balance + @payment WHERE acctnum = @account1 UPDATE accounts SET balance = balance - @payment WHERE acctnum = @account2 COMMIT; |
|
REPEATABLE READ | BEGIN; if (SELECT balance FROM accounts where acctnum = @account2) < @payment RAISE EXCEPTION '' END IF UPDATE accounts SET balance = balance + @payment WHERE acctnum = @account1 UPDATE accounts SET balance = balance - @payment WHERE acctnum = @account2 COMMIT; |
Данное поведение также может быть реализовано на уровне READ COMMITTED, но для этого нужно использовать механизм явных блокировок (обычно это что-то вроде UPDLOCK). |