Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sử dụng TransactionScope với đọc không cam kết - với (nolock) trong SQL có cần thiết không?

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 TimeoutIsolationLevel 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;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi HTTP 500.22 - Lỗi máy chủ nội bộ (Đã phát hiện thấy cài đặt ASP.NET không áp dụng trong chế độ đường ống được quản lý tích hợp.)

  2. Cách tạo dữ liệu ngẫu nhiên trong máy chủ SQL

  3. Làm cách nào để bỏ một cột có phụ thuộc đối tượng trong SQL Server 2008?

  4. 11 Phương pháp hay nhất về chỉ mục SQL Server để cải thiện hiệu suất

  5. Những tài nguyên nào tồn tại để điều chỉnh hiệu suất Cơ sở dữ liệu?