Câu trả lời ngắn gọn:Không
Câu trả lời dài:
Việc chỉ định nghĩa TransactionScope không xác định rằng bất kỳ lần đọc hoặc ghi nào sẽ được gọi trong một giao dịch.
Để chạy một cái gì đó trong một giao dịch, bạn vẫn phải mở và thực hiện một giao dịch!
TransactionOptions
của TransactionScope cho Timeout
và IsolationLevel
chỉ cần xác định giá trị mặc định cho bất kỳ giao dịch nào được tạo trong phạm vi mà không có các tùy chọn đó được thiết lập rõ ràng. Trên thực tế, TransactionScope có tạo một Giao dịch nhưng nó sẽ không hoạt động nếu không mở một Giao dịch mới. Nội bộ điều này sẽ thực hiện một số công việc phức tạp, sao chép giao dịch, v.v ... vì vậy hãy bỏ qua điều này ...
Nếu không có giao dịch, bạn không thể xác định mức cô lập, bất kỳ câu lệnh chọn nào sẽ được chạy với IsolationLevel.ReadCommitted
vì đây là mặc định của SQL Server.
Bạn cũng có thể truy vấn session.Transaction.IsActive
để xem liệu giao dịch có đang hoạt động trong phiên hay không!
Hãy xem đoạn mã sau, tôi đưa ra một số nhận xét để làm cho nó rõ ràng hơn một chút
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadUncommitted
}))
{
using (var session = sessionFactory.OpenSession())
{
// outside any transaction...
var x = session.Transaction.IsActive; // false;
// read will be done with SQL Server default (ReadCommited)
var pp = session.Query<Page>().Where(p => p.Photos.Count() > 1).ToList();
using (var transaction = session.BeginTransaction())
{
// will use ReadUncommitted according to the scope
var y = session.Transaction.IsActive; // true;
var p1 = session.Get<Page>(1);
transaction.Commit();
}
using (var transaction = session.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
// will use ReadCommitted according to the transaction initialization
var y = session.Transaction.IsActive; // true;
var p1 = session.Get<Page>(1);
transaction.Commit();
}
scope.Complete();
}
}
Bạn cũng có thể xem cách SQL Server phản ứng với các cài đặt đó bằng cách sử dụng SQL Server Profiler.
Chỉ cần tạo một Dấu vết mới và chú ý đến Audit Login
sự kiện, văn bản của sự kiện sẽ bao gồm mức cô lập và bạn có thể thấy rằng nó thực sự thực hiện Audit Login
mỗi khi một giao dịch được tạo, chẳng hạn như
set transaction isolation level read uncommitted
-
Vui lòng sửa cho tôi nếu bất kỳ thông tin nào trong số này có thể sai, tôi chỉ tự mình tìm ra điều này nên có thể có một số khả năng thất bại;)