Untuk mencegah operasi baca panjang memblokir operasi penulisan pendek dan sering di aplikasi web OLTP/pelaporan campuran saya yang ada yang didukung oleh SQL Server 2016, saya ingin menggunakan Isolasi Snapshot pada beberapa kueri yang sudah berjalan lama. Kueri telah diindeks dengan baik dan hanya membutuhkan waktu lama untuk dijalankan karena sejumlah besar data, dan sementara saya dapat menggunakan RCSI nanti, saya ingin memulai dengan menggunakan Isolasi Snapshot yang kurang invasif.

Pertanyaan saya adalah: bagaimana cara mengaktifkan Isolasi Snapshot pada kueri SELECT saya di C #? Sepertinya saya harus membungkus kueri pemilihan saya dalam sebuah transaksi, yang terasa benar-benar salah.

            List<Cat> cats = new List<Cat>();
            TransactionOptions transactionOption = new TransactionOptions
            {
                IsolationLevel = IsolationLevel.Snapshot
            };
            using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
            {
                using (SqlConnection sqlConnection = new SqlConnection(databaseConnectionString))
                {
                    using (SqlCommand sqlCommand = sqlConnection.CreateCommand())
                    {
                        sqlCommand.CommandText = "proc_Select_A_Billion_Cats";
                        sqlCommand.CommandType = CommandType.StoredProcedure;

                        sqlConnection.Open();

                        using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
                        {
                            while (sqlDataReader.Read())
                            {
                                // SOME CODE HERE can read the Cat object in from data reader

                                // Add this cat to the collection
                                cats.Add(cat);
                            }
                        }
                    }
                }
            }

Dari http://www.levibotelho.com/development/ plugging-isolation-leaks-in-sql-server/ Saya dapat melihat bahwa di SQL Server 2014 dan kemudian tingkat isolasi akan diatur ulang ketika koneksi dikembalikan ke kumpulan, jadi itu bagus.

Tetapi apakah benar untuk membungkus proc tersimpan yang hanya PILIH dalam transaksi ADO.NET? Apakah tidak ada cara yang lebih baik dari ini untuk mengimplementasikan Isolasi Snapshot di C#?

1
J.T. Taylor 23 Maret 2020, 08:43

1 menjawab

Jawaban Terbaik

Tidak, Anda perlu setel tingkat isolasi dalam metode BeginTransaction:

Jika database telah diaktifkan untuk isolasi snapshot tetapi tidak dikonfigurasi untuk READ_COMMITTED_SNAPSHOT ON, Anda harus memulai SqlTransaction menggunakan nilai enumerasi IsolationLevel.Snapshot saat memanggil metode BeginTransaction.

Jika tidak, mode default Read Committed digunakan dan READ akan diblokir oleh transaksi yang mengubah tabel (mungkin).

0
gotqn 23 Maret 2020, 06:20