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

Версия 1.16 от Alexandr Fokin на 2023/02/25 14:45

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