Исходный код вики Примеры.

Версия 1.18 от Alexandr Fokin на 2023/03/11 23:10

Последние авторы
1 (% style="width:1426px" %)
2 |(% style="width:155px" %)**Необходимый уровень изоляции**|(% style="width:614px" %)**Запрос**|(% style="width:652px" %)**Комментарий**
3 |(% style="width:155px" %) |(% style="width:614px" %) |(% style="width:652px" %)Замечание: в приведенных ниже примерах не рассматриваются сценарии с использованием [[Оптимистичная блокировка>>doc:Архитектура и модели.Блокировки.Оптимистичная блокировка.WebHome]].
4 |(% style="width:155px" %)READ COMMITTED|(% style="width:614px" %){{code language="sql"}}BEGIN;
5
6 UPDATE accounts
7 SET balance = balance + @payment
8 WHERE acctnum = @account1
9
10 UPDATE accounts
11 SET balance = balance - @payment
12 WHERE acctnum = @account2
13
14 COMMIT;{{/code}}|(% style="width:652px" %)(((
15 * Относительное изменения значения (а не константное).
16 * Без проверок.
17 )))
18 |(% style="width:155px" %)REPEATABLE READ|(% style="width:614px" %){{code language="sql"}}BEGIN;
19
20 if (SELECT balance FROM accounts where acctnum = @account2) < @payment
21 RAISE EXCEPTION ''
22 END IF
23
24 UPDATE accounts
25 SET balance = balance + @payment
26 WHERE acctnum = @account1
27
28 UPDATE accounts
29 SET balance = balance - @payment
30 WHERE acctnum = @account2
31
32 COMMIT;{{/code}}|(% style="width:652px" %)(((
33 * Предварительная проверка условия перед изменением строк.
34 Гарантия, что значение не будет изменено другими транзакциями после проверки (или их изменение будет обнаружено и приведет к ошибке).
35 * В запросе могут использоваться как относительные, так и константные значения, при условии что значение было сформировано после проверки допустимости операции.
36
37 ----
38
39 Данное поведение также может быть реализовано на уровне READ COMMITTED, но для этого нужно использовать механизм явных блокировок (обычно это что-то вроде UPDLOCK).
40 (Причем для данного примера явная блокировка была бы обязательна только для проверяемого аккаунта, с которого выполняется списание).
41 )))