Trong bài đăng này, tôi sẽ chia sẻ một lưu ý quan trọng về mức cách ly READ COMMITTED và cách nó hoạt động với tùy chọn READ_COMMITTED_SNAPSHOT của SQL Server.
READ COMMITTED là mức cách ly mặc định của SQL Server và nó ngăn chặn việc đọc bẩn.
Câu lệnh SELECT của bạn luôn trả về dữ liệu đã cam kết.
Nó phát hành khóa chia sẻ đối với dữ liệu nơi dữ liệu đang cập nhật hoặc có khóa độc quyền, do đó, để chọn những dữ liệu đó, bạn phải đợi để hoàn thành giao dịch đó.
Bây giờ hãy kiểm tra mức cách ly READ COMMITTED:
Đầu tiên, tạo một bảng với dữ liệu mẫu:
1 2 3 4 5 6 7 8 9 10 11 12 | CREATE TABLE tbl_Employee ( EmpID INTEGER ,EmpName VARCHAR(50) ) GO INSERT INTO tbl_Employee VALUES (1,'Anvesh'),(2,'Neevan') ,(3,'Roy'),(4,'Martin') GO |
Mở cửa sổ hoặc phiên truy vấn mới và thực thi tập lệnh này:
1 2 3 4 | BEGIN TRANSACTION UPDATE tbl_Employee SET EmpName ='Jenny' WHERE EmpID=1 WAITFOR DELAY '00:00:15' COMMIT |
Trong thời gian trễ 15 giây, hãy mở một cửa sổ hoặc phiên truy vấn mới và cố gắng CHỌN bảng đó:
1 | SELECT *FROM tbl_Employee |
Tùy chọn READ_COMMITTED_SNAPSHOT là gì?
Mức cách ly READ COMMITTED phụ thuộc vào cài đặt BẬT / TẮT tùy chọn.
Theo mặc định, nó là TẮT.
Lệnh ALTER để chuyển nó sang ON / OFF:
12345 -- Switch to ONALTER DATABASE Database_Name SET READ_COMMITTED_SNAPSHOT BẬT WITH ROLLBACK IMMEDIATE-- Switch to OFFALTER DATABASE Database_Name SET READ_COMMITTED_SNAPSHOT TẮT WITH ROLLBACK IMMEDIATE
READ_COMMITTED_SNAPSHOT TẮT:
Đây là cài đặt mặc định và đưa ra các khóa chia sẻ để ngăn giao dịch khác khi chúng tôi đang đọc hoặc cập nhật dữ liệu bảng.
Phần minh họa nhỏ ở trên đại diện cho hoạt động của cài đặt mặc định này.
READ_COMMITTED_SNAPSHOT BẬT:
Khi tùy chọn cơ sở dữ liệu READ_COMMITTED_SNAPSHOT được BẬT, tính năng phân lập đã cam kết đọc sử dụng lập phiên bản hàng.
ĐỌC CAM KẾT SNAPSHOT đọc lạc quan và viết bi quan. Khi dữ liệu đang cập nhật, bạn vẫn có thể đọc phiên bản cũ của dữ liệu và không có bất kỳ khóa chia sẻ nào, nhưng bạn không thể cập nhật cùng dữ liệu đó cho đến khi bản cập nhật đang chạy chưa kết thúc.
Điều này rất khác so với cấp độ Cách ly Ảnh chụp nhanh.
Nó tiêu thụ ít không gian tempdb hơn so với cách ly ảnh chụp nhanh.
Ở cấp Cách ly Ảnh chụp nhanh, cùng một dữ liệu gây ra xung đột cập nhật vì hai giao dịch khác nhau có thể cập nhật cùng một phiên bản của hàng.
Now, test the READ_COMMITTED_SNAPSHOT BẬT:
Lệnh ALTER để BẬT READ_COMMITTED_SNAPSHOT:
1 | ALTER DATABASE Database_Name SET READ_COMMITTED_SNAPSHOT BẬT WITH ROLLBACK IMMEDIATE |
Mở cửa sổ hoặc phiên truy vấn mới và thực thi tập lệnh bên dưới:
1 2 3 4 | BEGIN TRANSACTION UPDATE tbl_Employee SET EmpName ='Jenny' WHERE EmpID=1 WAITFOR DELAY '00:00:15' COMMIT |
Trong thời gian trễ 15 giây, hãy mở một cửa sổ hoặc phiên truy vấn mới và cố gắng CHỌN bảng này:
1 | SELECT *FROM tbl_Employee |
Trong thời gian trễ 15 giây, hãy mở một cửa sổ hoặc phiên truy vấn mới và cố gắng CẬP NHẬT cùng một hàng:
1 | UPDATE tbl_Employee SET EmpName ='Jekvlin' WHERE EmpID=1 |