Tôi hy vọng ai đó có thể làm sáng tỏ hành vi này mà tôi không mong đợi về sự cô lập SNAPSHOT so với TRUNCATE.
Cơ sở dữ liệu: Cho phép cách ly Snapshot = True; Đã đọc Ảnh chụp cam kết Bật = Sai.
Quy trình1 (Thay thế nội dung của bảng foo từ một CHỌN phức tạp chạy dài với nhiều liên kết):
BEGIN TRAN;
TRUNCATE TABLE foo;
INSERT INTO foo SELECT...;
COMMIT;
Thủ tục2 (Đọc từ bảng foo):
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT * FROM foo;
Nếu Routure1 đang chạy trong khi Processure2 được thực thi, thì Processure2 được giữ với một LCK_M_SCH_S chờ đợi (theo sp_WhoIsActive) cho đến khi Routure1 kết thúc. Và khi Thủ tục 2 hoàn thành, nó sẽ đưa ra ngoại lệ này:
Giao dịch cách ly ảnh chụp không thành công trong cơ sở dữ liệu 'DatabaseName' vì đối tượng được truy cập bởi câu lệnh đã được sửa đổi bởi câu lệnh DDL trong một giao dịch đồng thời khác kể từ khi bắt đầu giao dịch này. Nó không được phép vì siêu dữ liệu không được phiên bản. Một bản cập nhật đồng thời cho siêu dữ liệu có thể dẫn đến sự không nhất quán nếu trộn lẫn với cách ly ảnh chụp nhanh.
Tuy nhiên, Microsoft không liệt kê TRUNCATE dưới dạng câu lệnh DDL không được phép theo cách ly SNAPSHOT: http://msdn.microsoft.com/en-us/l Library / bb933783.aspx
Rõ ràng là tôi không hiểu điều gì đó một cách chính xác, vì tôi đã mong đợi một trường hợp tốt nhất của Quy trình 2 ngay lập tức trả lại dữ liệu được cam kết gần đây nhất từ bảng trước TRUNCATE hoặc trường hợp xấu nhất được giữ bởi Quy trình1 và sau đó trả lại nội dung mới của bàn. Bạn có thể giúp?