Базы данных
Транзакции
insert into accs (id, money) values (1, 0);
update accs set money = money - 100 where id = 1; update accs set money = money + 100 where id = 2;
start transaction
commit
rollback
start transaction;
if ((select money from accs where id = 1) <= 100)
rollback;
end if;
update accs set money = money - 100 where id = 1;
update accs set money = money + 100 where id = 2;
commit;
| Транзакция 1 | Транзакция 2 |
|---|---|
| retrieve v update v commit | retrieve v update v commit |
| Транзакция 1 | Транзакция 2 |
|---|---|
update v commit | update v rollback |
| Транзакция 1 | Транзакция 2 |
|---|---|
retrieve v commit | update v rollback |
| Транзакция 1 | Транзакция 2 |
|---|---|
retrieve v_1 retrieve v_2 commit | update v_1 = v_1 - 10 update v_2 = v_2 + 10 commit |
| – | S | X | |
| – | + | + | + |
| S | + | + | − |
| X | + | − | − |
| Транзакция 1 | Транзакция 2 |
|---|---|
| retrieve v_1 update v_2 | retrieve v_2 update v_1 |
| Транзакция 1 | Транзакция 2 |
|---|---|
retrieve v commit | update v rollback |
if v_1 + v_2 ≥ Δ then v_1 = v_1 − Δ end if
if v_1 + v_2 ≥ Δ then v_2 = v_2 − Δ end if
| Аномалия / Уровень | S | SN | RR | RC | RU |
|---|---|---|---|---|---|
| Косая запись | − | + | + | + | + |
| Фантомная запись | − | − | + | + | + |
| Неповторяемое чтение | − | − | − | + | + |
| Грязное чтение | − | − | − | − | + |
start transaction [режим] [изоляция] [настройки]
read {only | write}
[isolation level уровень]
commit [work] [and [no] chain]
rollback [work] [and [no] chain]
start transaction isolation level serializable;
// 1
start transaction isolation level read committed;
// 2
start transaction isolation level read committed;
// 1
start transaction isolation level serializable;
// 2
commit and no chain;
// 3
rollback;
savepoint имя
rollback to savepoint имя
release savepoint имя
add constraint ... режим
set constraints {all|имена} {deferred|immediate}