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 inserted
và deleted
, 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 inserted
và deleted
: 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 inserted
và deleted
. 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 inserted
và deleted
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 inserted
và deleted
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:
Trước khi SQL Server 2005, inserted
và deleted
bảng được đọc từ Log giao dịch (Tôi tin).
Nói tóm lại, inserted
và deleted
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
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. –
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. –
@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. –