6

Tôi muốn sử dụng TransactionScope trong dự án của mình. Tôi đọc về nó và tôi thấy rằng nó tạo ra một giao dịch tiềm ẩn trong cơ sở dữ liệu. Tôi muốn biết liệu các bảng khóa TransactionScope có thao tác không?Bảng khóa giao dịchScope và IsolationLevel

Ví dụ trong mã này:

using (Entities ent = new Entities()) 
{ 
    using (TransactionScope tran = Common.GetTransactionScope()) 
    { 
     var oldRecords = ent.tblUser.Where(o => o.UserID == UserID); 

     foreach (var item in oldRecords) 
     { 
      ent.tblUser.DeleteObject(item); 
     } 

public static TransactionScope GetTransactionScope() 
{ 
    TransactionOptions transactionOptions = new TransactionOptions(); 
    transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable; 
    return new TransactionScope(TransactionScopeOption.Required, transactionOptions); 
} 

tblUser khóa đến khi vấn đề Complete lệnh?

IsolationLevel trong giao dịch rõ ràng tương tự như giao dịch ngầm không?

Cảm ơn

Trả lời

9

Đó là SQL Server mà không được khóa - nếu cần thiết. Mọi hoạt độngUPDATE hoặc DELETE phải nhận được khóa độc quyền trên những hàng mà nó ảnh hưởng - nếu những hàng đó bị khóa bởi giao dịch khác, nó không thể thực hiện điều đó.

Vì vậy, trong trường hợp của bạn, nếu bạn bị xóa một số hàng khỏi cơ sở dữ liệu, SQL Server theo mặc định sẽ khóa những hàng đó chỉ - những hàng đang bị xóa. Nó không khóa toàn bộ bàn. Đây là trừ bạn xóa một số lượng rất lớn của hàng cùng một lúc - nếu bạn xóa nhiều rồi 5'000 hàng trong một giao dịch duy nhất, SQL Server sẽ cố gắng để làm một khóa leo thang và khóa toàn bộ bảng (thay vì giữ và quản lý hơn 5000 khóa hàng riêng lẻ).

Mức cô lập chỉ xác định bao lâu đọc sẽ khóa liên tiếp - theo mặc định (READ COMMITTED), hàng sẽ có một chia sẻ khóa chỉ cho thời gian nó đang được đọc - thường là một thời gian rất rất ngắn. Với mức cách ly REPEATABLE READ, khóa chia sẻ sẽ được giữ cho đến khi kết thúc giao dịch hiện tại và SERIALIZABLE sẽ không chỉ khóa các hàng đang đọc mà còn toàn bộ dãy hàng. Nhưng một lần nữa: đó chỉ ảnh hưởng ĐỌC hoạt động - nó không có tác động trực tiếp trên DELETE hoặc UPDATE báo cáo (trừ có một khóa chia sẻ trên một hàng có thể ngăn chặn sự DELETE từ mua nó khóa độc quyền mà nó cần)

+0

Câu trả lời hay. @marc_s ở trên mã nếu tôi xóa bản ghi với 'ID = 1' và trong thời điểm đó, một chuỗi khác muốn đọc' ID = 1' điều gì đã xảy ra? Bạn nói rằng tôi sẽ nhận được khóa độc quyền nhưng 'TransactionScope' có khóa ẩn? – Arian

+0

Nếu giao dịch 'DELETE' của bạn nhận khóa độc quyền, không giao dịch nào khác có thể đọc hàng này - nó sẽ bị khóa và có thể sẽ hết thời gian chờ –

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