2015-02-17 10 views
6

Tôi đã tìm kiếm tài liệu dứt khoát về mức cô lập (hoặc đồng thời hoặc phạm vi ... Tôi không chắc chắn CHÍNH XÁC gọi nó là gì) của trình kích hoạt trong SQL Server. Tôi đã tìm thấy các nguồn sau đây chỉ ra rằng những gì tôi tin là đúng (có nghĩa là hai người dùng, thực hiện cập nhật cho cùng một bảng - thậm chí cùng các hàng-- sau đó sẽ kích hoạt các trình kích hoạt độc lập và riêng biệt) :Cách ly kích hoạt máy chủ SQL/Tài liệu phạm vi

câu hỏi thứ nhất về bản chất là cùng một câu hỏi tôi đang cố gắng tìm câu trả lời, nhưng câu trả lời được đưa ra không cung cấp bất kỳ nguồn nào. Câu hỏi thứ hai cũng đạt gần dấu, và câu trả lời là như nhau, nhưng một lần nữa, không có nguồn nào được cung cấp.

Ai đó có thể chỉ cho tôi nơi tài liệu có sẵn đưa ra cùng xác nhận không?

Cảm ơn!

+0

Có. 1 người dùng sẽ không thể xem dữ liệu từ người dùng thứ hai cùng một lúc. Tất nhiên, giả định rằng kích hoạt không sử dụng đọc không được cam kết hoặc nolock. Điều này là đơn giản để chứng minh cho chính mình. Tạo một bảng có trình kích hoạt. Sau đó, mở 1 tab trong SSMS và bắt đầu một giao dịch và thực hiện chèn. Đừng cam kết giao dịch đó và thực hiện tương tự trong tab thứ hai. Tab thứ hai không thể xem dữ liệu không được cam kết từ tab 1. –

+0

Tôi không chắc chắn bạn sẽ tìm thấy bất kỳ tài liệu chính thức nào nêu rõ điều này dưới dạng bạn muốn. Nhưng nó khá dễ dàng để tưởng tượng sự phát triển kích hoạt hỗn loạn như thế nào nếu nó không như vậy. –

+0

@Damien_The_Unbeliever Có một số tài liệu chính thức mà tôi liên kết với nó cung cấp cho bit và phần của điều này. –

Trả lời

7

Vâng, Cấp độ và phạm vi cách ly là hai điều rất khác nhau.

Cấp cách ly
Kích hoạt hoạt động trong giao dịch. Theo mặc định, giao dịch đó sẽ sử dụng mức cách ly mặc định là READ COMMITTED. Tuy nhiên, nếu quá trình gọi đã chỉ định một mức cách ly khác, thì điều đó sẽ ghi đè lên giá trị mặc định. Như thường lệ: nếu muốn, bạn sẽ có thể ghi đè lên trong chính trình kích hoạt.

Theo trang MSDN cho DML Triggers:

Các kích hoạt và tuyên bố rằng đám cháy nó được coi là một giao dịch duy nhất, có thể được cuộn lại từ bên trong cò. Nếu phát hiện lỗi nghiêm trọng (ví dụ, không đủ dung lượng đĩa), toàn bộ giao dịch sẽ tự động quay lại.

Phạm vi
Bối cảnh được cung cấp là:

{từ bạn}

hai người dùng, thực hiện cập nhật để cùng một bảng --even các hàng cùng

{từ bài viết MSDN được liên kết đầu tiên trong Câu hỏi "về cơ bản cùng một câu hỏi tôi đang cố gắng t o tìm câu trả lời cho "}

Các bảng được chèn và xóa đã được dàn xếp cho phiên hiện tại chưa? Nói cách khác, chúng sẽ chỉ chứa các bản ghi đã chèn và đã xóa cho phạm vi hiện tại, hoặc chúng sẽ chứa các bản ghi cho tất cả các hoạt động cập nhật hiện tại trên cùng một bảng không? Thậm chí có thể có các hoạt động đồng thời thực sự hoặc khóa sẽ ngăn chặn điều này không?

Trước khi vào các bảng inserteddeleted, cần phải có một hoạt động DML duy nhất xảy ra trên một hàng cụ thể tại bất kỳ thời điểm cụ thể nào. Hai hoặc nhiều yêu cầu có thể đi vào chính xác cùng một nano giây, nhưng tất cả các yêu cầu sẽ thay phiên nhau, mỗi lần một yêu cầu (và có, do khóa).

Bây giờ, về những gì có trong các bảng inserteddeleted: Vâng, chỉ có các hàng cho rằng sự kiện đặc biệt sẽ được (và thậm chí có thể được) trong hai giả bảng. Nếu bạn thực hiện một UPDATE sẽ sửa đổi 5 hàng, chỉ có 5 hàng đó sẽ nằm trong các bảng inserteddeleted. Và vì bạn đang tìm kiếm tài liệu, trang MSDN cho các trạng thái Use the inserted and deleted Tables:

Bảng đã xóa bản sao của các hàng bị ảnh hưởng trong các câu lệnh DELETE và UPDATE. Trong khi thực thi câu lệnh DELETE hoặc UPDATE, các hàng sẽ bị xóa khỏi bảng kích hoạt và được chuyển tới bảng đã xóa. Bảng đã xóa và bảng kích hoạt thông thường không có các hàng chung.

Bảng đã chèn lưu trữ các bản sao của các hàng bị ảnh hưởng trong các câu lệnh INSERT và UPDATE. Trong một giao dịch chèn hoặc cập nhật, các hàng mới sẽ được thêm vào cả bảng đã chèn và bảng kích hoạt. Các hàng trong bảng được chèn vào là các bản sao của các hàng mới trong bảng kích hoạt.

Ràng buộc này trở lại với phần khác của câu hỏi, phần liên quan đến việc cô lập giao dịch Level: Các Isolation giao dịch Cấp đã hoàn toàn không ảnh hưởng đến các bảng inserteddeleted khi họ liên quan đặc biệt với sự kiện/truy vấn. Tuy nhiên, hiệu ứng ròng của hoạt động đó, được ghi lại trong hai bảng psuedo này, vẫn có thể là có thể nhìn thấy đối với các quá trình khác nếu chúng đang sử dụng Cấp cách ly READ UNCOMMITTED hoặc gợi ý bảng NOLOCK.

Và chỉ để làm rõ điều gì đó, trang MSDN được liên kết ở trên liên quan đến các bảng inserteddeleted nêu ở đầu chúng là "trong bộ nhớ" nhưng điều đó không chính xác. Bắt đầu từ SQL Server 2005, hai bảng giả này thực sự có trụ sở tại tempdb. Các trang MSDN cho tempdb Database trạng thái:

các tempdb cơ sở dữ liệu hệ thống là một nguồn lực toàn cầu đó là có sẵn cho tất cả người dùng kết nối với các thể hiện của SQL Server và được sử dụng để tổ chức như sau:

  • ...

  • Các phiên bản hàng được tạo bởi các giao dịch sửa đổi dữ liệu cho các tính năng, như: hoạt động chỉ mục trực tuyến, nhiều bộ kết quả hoạt động (MARS) và trình kích hoạt SAU.

Trước khi SQL Server 2005, inserteddeleted bảng được đọc từ Log giao dịch (Tôi tin).


Nói tóm lại, inserteddeleted bảng:

  • hoạt động trong một giao dịch
  • là tĩnh (tức là read-only) bảng
  • có thể nhìn thấy chỉ Trigger hiện
  • chỉ chứa các hàng cho sự kiện/hoạt động/truy vấn cụ thể đã kích hoạt phiên bản đó của Trình kích hoạt
+1

wow .... câu trả lời chi tiết! Cảm ơn vì nỗ lực đó! – reidLinden

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