2012-10-02 38 views
7

Đối với mức độ cách ly Snapshot trong SQL Server 2008 R2, sau đây được đề cập trong tài liệu MSDN ADO.Net:Đỗ viết trong mức độ cách ly SNAPSHOT khối viết trong một giao dịch SNAPSHOT trong SQL Server 2008 R2

Các giao dịch điều chỉnh dữ liệu không chặn các giao dịch đọc dữ liệu và các giao dịch đọc dữ liệu không chặn các giao dịch ghi dữ liệu, vì chúng thường theo mức cô lập READ COMMITTED mặc định trong SQL Server.

Không có đề cập đến việc ghi sẽ chặn ghi, khi cả hai giao dịch đều ở chế độ cách ly SNAPSHOT. Vì vậy, câu hỏi của tôi là như sau: Sẽ viết trong khối giao dịch SNAPSHOT ghi vào cùng một bảng trong giao dịch SNAPHOT2 khác?

CẬP NHẬT MỚI NHẤT

Sau khi thực hiện rất nhiều suy nghĩ về câu hỏi của tôi, tôi đi đến kết luận như đã đề cập trong đoạn văn dưới đây. Hy vọng những người khác có thể ném thêm ánh sáng về điều này.

Không có cơ sở dữ liệu quan hệ trong đó ghi KHÔNG chặn viết. Nói cách khác, viết sẽ luôn luôn viết khối. Viết sẽ bao gồm các câu lệnh như INSERT hoặc UPDATE hoặc DELETE. Điều này đúng bất kể mức cô lập bạn sử dụng, vì tất cả các cơ sở dữ liệu quan hệ cần phải thực hiện tính nhất quán dữ liệu, khi nhiều ghi đang diễn ra trong cơ sở dữ liệu. Tất nhiên, việc ghi đồng thời cần phải xung đột (như chèn vào cùng một bảng hoặc cập nhật cùng một hàng/s) cho việc chặn này xảy ra.

+0

Xem thêm: http: // stackoverflow.com/questions/1044164/using-isolationlevel-snapshot-but-db-vẫn-khóa – StuartLC

Trả lời

3

Không. Chúng sẽ không chặn. Thay vào đó, lệnh UPDATE trong trans2 sẽ không thành công với số lỗi 3960.

Vì cách hoạt động của cách ly, bất kỳ lệnh UPDATE nào có thể bị lỗi. Cách duy nhất bạn có thể nói là để nắm bắt và xử lý lỗi 3960 (nó được gọi là đồng thời lạc quan vì bạn không mong đợi tình trạng này xảy ra rất thường xuyên).

Tôi đã kết thúc thử nghiệm này theo kinh nghiệm, bởi vì nó không hoàn toàn rõ ràng từ tài liệu. This blog post minh họa nó độc đáo mặc dù.


Assumption: cả hai trans1trans2 được UPDATEing cùng hàng trong cùng một bảng. Cập nhật hai hàng khác nhau sẽ hoạt động tốt.

+0

igos - Cảm ơn bạn đã trả lời. Làm thế nào về hai giao dịch SNAPSHOT với INSERTS? Cả hai đều đang cố chèn hàng mới. Họ vẫn sẽ chặn nhau? – Sunil

+0

@Sunil 'INSERT' không được chặn lẫn nhau (giả sử bạn không cố gắng chèn cùng một khóa chính) – ligos

+0

@Sunil sau khi đọc bản cập nhật của bạn, 'INSERT' không bế tắc lẫn nhau (giả sử các khóa chính khác nhau). Chúng có thể bị chặn trong giây lát khi khóa nhận dạng mới được tạo và dữ liệu thực sự được viết, nhưng chúng không bị khóa hoặc chặn khóa bàn. 'UPDATE' s làm. Tôi đã không thử kiểm tra 'DELETE's (vì tôi hiếm khi sử dụng chúng), nhưng tôi nghi ngờ chúng sẽ giống với' UPDATE'. – ligos

4

Ligos thực sự không chính xác - nếu hai giao dịch riêng biệt đang cố gắng cập nhật cùng một bản ghi với Ảnh chụp nhanh, giao dịch 2 S be bị chặn cho đến khi giao dịch 1 giải phóng khóa. Sau đó, và CHỈ sau đó, bạn sẽ nhận được lỗi 3960. Tôi nhận ra chủ đề này là hơn 2 tuổi, nhưng tôi muốn tránh bỏ lỡ thông tin được ra khỏi đó.

Ngay cả những liên kết Ligos tham chiếu nói điều chính xác cùng tôi nhắc đến ở trên (xem đoạn non-red cuối cùng)

Viết vs Write sẽ chỉ không bị chặn nếu hai hồ sơ (ví dụ. Hàng) cố gắng được cập nhật khác nhau

Các vấn đề liên quan