GIAO DỊCH CẤP ĐỘ CẤP CẤP SNAPSHOT so với TRUNCATE?


10

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?


Bạn có thể sử dụng DELETE TỪ foo thay thế? Điều đó sẽ không đặt khóa lược đồ.
SqlACID

XÓA TỪ thực sự là cách tôi đang làm việc xung quanh này. Tôi cũng quan tâm đến lý do tại sao tôi nhận được lỗi (và chỉ sau khi Thủ tục1 trở lại).
Đánh dấu Freeman

Câu trả lời:


19

Danh sách các 'DDL'hoạt động được liệt kê là không đầy đủ (và TRUNCATE TABLEkhông phải là thiếu sót duy nhất từ ​​danh sách đó). Cho dù TRUNCATE TABLEDMLhoặc DDLlà một câu hỏi đầy trong SQL Server, với các ví dụ thuyết phục trên cả hai mặt của cuộc tranh luận, và các mục cả hai cách trong sách trực tuyến.

Từ quan điểm của một giao dịch cách ly ảnh chụp nhanh, cắt ngắn có chất lượng thiết yếu của việc lấy Sch-Mkhóa , điều này giải thích việc chặn (bởi vì RCSISIvẫn có được các Sch-Skhóa ); và nó cũng làm hỏng phiên bản siêu dữ liệu nội bộ (vì lý do nội bộ *) dẫn đến lỗi 3961.

Vì vậy, hành vi bạn đang thấy được mong đợi, chỉ là không được ghi chép lại rất tốt.

* Việc triển khai TRUNCATE TABLE hiện tại không tạo ra các phiên bản hàng. Trả lại phiên bản siêu dữ liệu là cách đơn giản nhất để đảm bảo hành vi chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.