Transakcje i obsługa błędów w SQL Server
Miriam Antona
Software Engineer
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
| Brudne odczyty | Odczyty niepowtarzalne | Odczyty fantomowe | |
|---|---|---|---|
| READ UNCOMMITTED | tak | tak | tak |
| READ COMMITTED | nie | tak | tak |
Pierwotne saldo konta 5 = 35 000 USD
Transakcja1
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Transakcja2
...
...
...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
Musi czekać!
Pierwotne saldo konta 5 = 35 000 USD
Transakcja1
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

COMMIT TRAN;
Transakcja2
...
...
...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00 |
Transakcja1
BEGIN TRAN
SELECT current_balance
FROM accounts WHERE account_id = 5;
Transakcja2
...
...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00 |
Zalety:
Wady:
Kiedy stosować?:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
| Brudne odczyty | Odczyty niepowtarzalne | Odczyty fantomowe | |
|---|---|---|---|
| READ UNCOMMITTED | tak | tak | tak |
| READ COMMITTED | nie | tak | tak |
| REPEATABLE READ | nie | nie | tak |
Transakcja1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
SELECT current_balance FROM accounts
WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00 |
Transakcja2
...
...
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Musi czekać!
Transakcja1
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
Transakcja2
...
...
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Musi czekać!
Transakcja1
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
Transakcja2
...
...
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
(1 rows affected)
Zalety:
Wady:
REPEATABLE READKiedy stosować?:
Transakcje i obsługa błędów w SQL Server