Giao dịch và Xử lý lỗi trong SQL Server
Miriam Antona
Software Engineer
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
| Đọc bẩn | Đọc không lặp lại | Đọc bóng ma | |
|---|---|---|---|
| READ UNCOMMITTED | có | có | có |
| READ COMMITTED | không | có | có |
Số dư ban đầu tài khoản 5 = $35.000
Giao dịch 1
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Giao dịch 2
...
...
...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
Phải chờ!
Số dư ban đầu tài khoản 5 = $35.000
Giao dịch 1
BEGIN TRAN
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

COMMIT TRAN;
Giao dịch 2
...
...
...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00 |
Giao dịch 1
BEGIN TRAN
SELECT current_balance
FROM accounts WHERE account_id = 5;
Giao dịch 2
...
...
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00 |
Ưu:
Nhược:
Khi dùng:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
| Đọc bẩn | Đọc không lặp lại | Đọc bóng ma | |
|---|---|---|---|
| READ UNCOMMITTED | có | có | có |
| READ COMMITTED | không | có | có |
| REPEATABLE READ | không | không | có |
Giao dịch 1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
SELECT current_balance FROM accounts
WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00 |
Giao dịch 2
...
...
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Phải chờ!
Giao dịch 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
Giao dịch 2
...
...
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
Phải chờ!
Giao dịch 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
Giao dịch 2
...
...
UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
(1 hàng bị ảnh hưởng)
Ưu:
Nhược:
REPEATABLE READ.Khi dùng:
Giao dịch và Xử lý lỗi trong SQL Server