2013-01-26 43 views
5

Tôi đang sử dụng EF 4.0 và tôi muốn sử dụng mức cách ly serializable, bởi vì trong giao dịch, tôi muốn chặn đăng ký khi được đọc.cách thay đổi mức cách ly?

Vâng, trong SQL Server Tôi cố gắng để thay đổi mức độ cô lập với lệnh này:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

Và trong C# Tôi sử dụng mã này để cố gắng ngăn chặn việc đăng ký:

using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.Serializable })) 
{ 
    Entities myContext = new Entities(); 
    string colors = "select * from Colors where IDColor = 2"; 
    Colors myColor = myContext.Colors.SqlQuery(colors).FirstOrDefault<Colors>(); 
    myColor.Color = "Red"; 
    myContext.SaveChanges(); 
    scope.Complete();     
} 

Nếu tôi thực thi từng dòng mã của tôi, nếu tôi nhận được SaveChanges nhưng vẫn không thực thi, nếu tôi thực hiện truy vấn với các màu bảng với SQL Server Management Studio chẳng hạn, tôi có thể lấy bản ghi. Sau đó, nếu tôi thực hiện lưu thay đổi và tôi nhận được scope.Clompete(), nếu tôi thử truy vấn với Management Studio, tôi sẽ không nhận được gì vì đăng ký bị chặn, vì vậy khi tôi hoàn thành mã C#, thanh ghi sẽ được giải phóng và Tôi nhận được kết quả trong Management Studio.

Vì vậy, câu hỏi của tôi là, cách sử dụng mức cô lập có thể tuần tự hóa trong C#? Tôi có làm điều gì sai?

P.S .: Tôi nhận thấy rằng nếu tôi sử dụng lệnh này:

DBCC useroptions; 

tôi thấy rằng mức độ cô lập là serializable, nhưng nếu tôi đóng Management Studio và kết nối lại và xem mức độ cô lập là mặc định readCommitted.

Vì vậy, câu hỏi của tôi là cách đặt mức cách ly mặc định cho cơ sở dữ liệu của tôi.

+0

Tôi không hiểu. Bạn đã sử dụng giao dịch có thể tuần tự một cách chính xác. Bạn có thể giải thích những gì bạn muốn một cách khác nhau không? – usr

Trả lời

1
  • Mức cách ly giao dịch EF mặc định dựa trên nhà cung cấp cơ sở dữ liệu đã sử dụng.

  • Mức cách ly không xác định trong mã ef của bạn sẽ dẫn đến mức cách ly mặc định cho máy chủ cơ sở dữ liệu.

  • Trong mức cô lập mặc định của SQL Server là READ COMMITED.

  • Vì vậy, bạn không cần phải chỉ định IsolationLevel trên mã EF của mình.Nếu bạn đặt nó ở bên DB, nó sẽ là IsolationLevel mặc định cho EF.

Làm thế nào để thay đổi IsolationLevel trên DB Kiểm tra Isolation Levels in the Database EngineSET TRANSACTION ISOLATION LEVEL (Transact-SQL)

CẬP NHẬT

Đối với sự thay đổi các isolation level chạy dưới đây đề cập lệnh trên SSMS:

USE YourDatabaseName; 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

Đối với kiểm tra cho dù là nó được áp dụng?

USE YourDatabaseName; 
GO 
DBCC useroptions 

MSDN nói:

Chỉ có một trong các tùy chọn mức độ cô lập có thể được thiết lập cùng một lúc, và nó vẫn đặt ra cho mối quan hệ đó cho đến khi nó được thay đổi một cách rõ ràng. Tất cả các hoạt động đọc được thực hiện trong giao dịch hoạt động theo các quy tắc cho mức cách ly được chỉ định trừ khi có gợi ý bảng trong mệnh đề FROM của tuyên bố chỉ định khác nhau hoặc phiên bản hành vi cho bảng.

Tôi hy vọng điều này sẽ giúp ích cho bạn.

+0

@usr Không. Ở đây tôi có nghĩa là không thay đổi mức cô lập mặc định. Nếu một số người muốn thay đổi mức cô lập của DB (hoặc máy chủ sql) thì họ có thể làm điều đó bằng cách sử dụng bên db.Không cần phải làm điều đó trên mã ef bằng cách đưa ra mức cô lập là "Serializable "hoặc cái gì khác. Đó là toàn bộ vấn đề. Tôi cảm thấy tôi đúng không? – Sampath

+0

Tôi cũng thử lệnh TSQL trong studio quản lý, nhưng khi tôi thoát ra và nhập lại, mức cách ly là Read Committed. Làm thế nào tôi có thể thiết lập mức cô lập mãi mãi? –

+0

@Daimroc Tôi đã cập nhật bài đăng của mình. Plz kiểm tra điều đó. – Sampath

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