HOME /
Database / SQL / SQL Transaction – 1. Tổng quan
SQL Transaction – 1. Tổng quan
A. Các loại Anomaly
1. Dirty Reads
Transaction 2 đọc dữ liệu chưa đươc commit ở transaction 1
1 |
2 |
DATA |
START TRANSACTION; |
|
id = 1, username = 'Alice' |
UPDATE user SET username = 'Bob' WHERE id = '1'; |
START TRANSACTION; |
id = 1, username = 'Bob' |
|
SELECT username FROM user where id = '1'; |
id = 1, username = 'Bob' |
|
COMMIT; |
|
ROLLBACK; |
|
id = 1, title = 'Alice' |
2. Nonrepeatable Reads
- Transaction 2 đọc dữ liệu 2 lần ra 2 kết quả khác nhau
1 |
2 |
DATA |
|
START TRANSACTION; |
id = 1, username = 'Alice' |
START TRANSACTION; |
SELECT username FROM user where id = '1'; |
id = 1, username = 'Alice' |
UPDATE user SET username = 'Bob' WHERE id = '1'; |
|
id = 1, username = 'Bob' |
COMMIT; |
SELECT username FROM user where id = '1'; |
id = 1, title = 'Bob' |
|
COMMIT; |
|
3. Phantom Record: Bản ghi ma
- Bản ghi 'Bob' đã được thêm và làm cho kết quả đọc 2 lần sai lệch
1 |
2 |
DATA |
START TRANSACTION; |
START TRANSACTION; |
|
|
SELECT username FROM user where group_id = '1'; |
'Alice' |
INSERT INTO user (id, group_id, username) VALUES (4,1,'Bob') |
|
|
|
SELECT username FROM user where group_id = '1'; |
'Alice','Bob' |
COMMIT; |
COMMIT; |
|
B. Isolation level
|
Read Uncommitted |
Read Committed |
Repeatable Read |
Serializable |
UPDATE đợi transaction khác COMMIT UPDATE |
Y |
Y |
Y |
Y |
SELECT đợi transaction khác COMMIT UPDATE |
N |
Y |
Y |
Y |
LOCK khi SELECT (không cho transaction khác update) |
N |
N |
Y |
Y |
LOCK khi SELECT (không cho transaction khác delete, insert) |
N |
N |
N |
Y |
|
|
|
|
|
Dirt Read |
Y |
N |
N |
N |
Nonerepeatable Read |
Y |
Y |
N |
N |
Fantom Read |
Y |
Y |
Y |
N |