Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Penggunaan TransactionScope dengan read uncommitted - apakah dengan (nolock) dalam SQL diperlukan?

Jawaban singkat:Tidak

Jawaban panjang:

Mendefinisikan TransactionScope saja tidak menentukan bahwa pembacaan atau penulisan apa pun akan dipanggil dalam suatu transaksi.

Untuk menjalankan sesuatu dalam suatu transaksi, Anda masih harus membuka dan melakukan transaksi!

TransactionOptions dari TransactionScope untuk Timeout dan IsolationLevel cukup tentukan default untuk setiap transaksi yang dibuat dalam ruang lingkup tanpa opsi yang ditetapkan secara eksplisit. Sebenarnya TransactionScope memang membuat Transaksi tetapi tidak akan aktif tanpa membuka Transaksi baru. Secara internal ini akan melakukan beberapa hal yang rumit, mengkloning transaksi dll... jadi mari kita abaikan ini...

Tanpa transaksi, Anda tidak dapat menentukan tingkat isolasi, pernyataan pemilihan apa pun akan dijalankan dengan IsolationLevel.ReadCommitted karena ini adalah default SQL Server.

Anda juga dapat menanyakan session.Transaction.IsActive untuk melihat apakah transaksi saat ini aktif untuk sesi tersebut!

Mari kita lihat kode berikut, saya memberikan beberapa komentar untuk membuatnya sedikit lebih jelas

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();
    }
}

Anda juga dapat melihat bagaimana SQL Server bereaksi terhadap pengaturan tersebut dengan menggunakan SQL Server Profiler.

Cukup buat Jejak baru dan perhatikan Audit Login acara, teks acara akan menyertakan tingkat isolasi dan Anda dapat melihat bahwa itu benar-benar melakukan Audit Login setiap kali transaksi dibuat, misalnya

 set transaction isolation level read uncommitted

--

Mohon koreksi saya jika ada informasi ini yang salah, saya hanya memikirkannya sendiri sehingga mungkin ada beberapa potensi kegagalan;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghubungkan SQL Server 2008 ke Java:Login gagal karena kesalahan pengguna

  2. Bagaimana cara hash kata sandi admin di tabel Pengguna saya?

  3. Linq To Sql dan identity_insert

  4. Permintaan SQL untuk menghitung catatan per bulan

  5. Cara Menonaktifkan Semua Batasan PERIKSA &Kunci Asing dalam Database di SQL Server (Contoh T-SQL)