Điều khiển tương tranh trong SQL SERVER
Concurrency Control in SQL Server
Khi nhiều người dùng truy cập cùng hạng mục dữ liệu cùng lúc thì xảy ra vấn đề tương tranh dữ liệu. Bài viết này minh họa một số trường hợp của vấn đề điều khiển tương tranh trong SQL Server.
Read Uncommitted: Đọc dữ liệu chưa commit
Giả sử số dư của các tài khoản trong bảng ACCOUNTS như sau:
Query 1
Query 2
Với Read Uncomitted , query 2 không chờ cho đến khi query 1 kết thúc mới đọc dữ liệu, vì vậy kết quả số dư đọc được của tài khoản ‘TK001’ là 100 (chưa commit). Sau 10 giây, query 1 rollback và số dư của tài khoản ‘TK001’ vẫn là 500 (không đổi).
Read Comitted: Đọc dữ liệu đã commit (default)
Query 2
Với Read Comitted, Query 2 sẽ đợi cho đến khi Query 1 kết thúc (trong ví dụ này là 10 giây) mới đọc dữ liệu. Vì vậy kết quả đúng như mong đợi (500)
Repeatable Read: Đảm bảo cho nhiều tác vụ đọc dữ liệu (select) trong cùng một giao dịch có kết quả giống nhau.
Query 1
Query 2
Query 2 chỉ được thực hiện khi Query 1 đã hoàn thành, vì vậy kết quả 2 cậu lệnh SELECT trong Query 1 là giống nhau (500), sau đó số dư của tài khoản ‘TK001’ được đặt lại là 0
Serializable (highest isolation level): Đảm bảo rằng việc thêm mới dữ liệu vào bảng chỉ được thực hiện cho đến khi kết thúc giao dịch hiện hành.
Giả sử bảng ACCOUNTS có 4 tài khoản như sau
Query 1
Query 2
Câu lệnh INSERT trong Query 2 chỉ được thực hiện khi transaction trong Query 1 hoành thành, vì vậy kết quả của Query 1 vẫn cho ra số dòng dữ liệu trong bảng ACCOUNTS là 4.