2010-09-17 30 views
6

Tôi muốn triển khai SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED trong dự án sử dụng LINQ to SQL. Sự hiểu biết của tôi là điều này sẽ ảnh hưởng đến tất cả các câu lệnh chọn trên toàn cầu.Làm cách nào để triển khai lệnh này để ngăn chặn deadlocks với LINQ to SQL?

Tôi có đặt điều này trong DAL của tôi chứa đối tượng ngữ cảnh không? Nếu vậy, làm thế nào?

Cảm ơn! Đánh dấu

Trả lời

2

Bạn có thể làm điều này trên một mỗi DataContext/đơn vị cơ sở làm việc như thế này:

using (var con = new SqlConnection(constr)) 
{ 
    con.Open(); 

    using (var tran = 
     new con.BeginTransaction(IsolationLevel.ReadUncommitted)) 
    { 
     using (var db = new MyDataContext(con)) 
     { 
      // You need to set the transaction in .NET 3.5 (not in 4.0). 
      db.Transaction = tran; 

      // Do your stuff here. 

      db.SubmitChanges(); 
     } 

     tran.Commit(); 
    } 
} 

Tất nhiên bạn có thể trừu tượng tạo ra và cam kết và xử lý các kết nối và giao dịch đi, nhưng ví dụ này sẽ làm việc .

Lưu ý rằng điều này sẽ không đặt mức cách ly trên toàn cầu, chỉ cho các câu lệnh LINQ được thực hiện trong ngữ cảnh của lớp DataContext cụ thể đó.

1

LINQ, nói đúng, không phải là ngôn ngữ truy vấn cơ sở dữ liệu. Nó là một ngôn ngữ truy vấn miền có thể được dịch sang ngôn ngữ truy vấn DB như SQL. Như vậy, bạn không thể sử dụng chỉ Linq để thiết lập một mức cô lập cơ sở dữ liệu.

Tôi sẽ xem xét các công cụ mà ORM của bạn cung cấp cho bạn; nhất, ở một mức độ nào đó, liên quan đến một SQLConnection và SQLTransactions kiểu ADO. Bạn có thể trưng ra những đối tượng "session" của ORM, để thiết lập các mức cô lập và thực thi các lệnh cơ sở dữ liệu không phải DML khác.

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