Транзакции и обработка ошибок в SQL Server
Miriam Antona
Software Engineer
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
| Грязные чтения | Неповторяемые чтения | Фантомные чтения | |
|---|---|---|---|
| READ UNCOMMITTED | да | да | да |
| READ COMMITTED | нет | да | да |
Исходный баланс счёта 5 = $35 000
Транзакция 1
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Транзакция 2
...
...
...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
Ожидает!
Исходный баланс счёта 5 = $35 000
Транзакция 1
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

COMMIT TRAN;
Транзакция 2
...
...
...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00 |
Транзакция 1
BEGIN TRAN
SELECT current_balance
FROM accounts WHERE account_id = 5;
Транзакция 2
...
...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00 |
Преимущества:
Недостатки:
Когда использовать?:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
| Грязные чтения | Неповторяемые чтения | Фантомные чтения | |
|---|---|---|---|
| READ UNCOMMITTED | да | да | да |
| READ COMMITTED | нет | да | да |
| REPEATABLE READ | нет | нет | да |
Транзакция 1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
SELECT current_balance FROM accounts
WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00 |
Транзакция 2
...
...
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Ожидает!
Транзакция 1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
SELECT current_balance FROM accounts
WHERE account_id = 5;
SELECT current_balance FROM accounts
WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00 |
COMMIT TRAN
Транзакция 2
...
...
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Ожидает!
Транзакция 1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
SELECT current_balance FROM accounts
WHERE account_id = 5;
SELECT current_balance FROM accounts
WHERE account_id = 5;
COMMIT TRAN
Транзакция 2
...
...
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
(1 rows affected)
Преимущества:
Недостатки:
REPEATABLE READ.Когда использовать?:
Транзакции и обработка ошибок в SQL Server