DENGAN (NOLOCK) vs SET TINGKAT ISOLASI TRANSAKSI BACA TANPA SESUAI

118

Bisakah seseorang memberi saya beberapa panduan tentang kapan saya harus menggunakan WITH (NOLOCK)sebagai lawanSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Apa pro / kontra masing-masing? Apakah ada konsekuensi yang tidak diinginkan yang Anda hadapi saat menggunakan salah satu dan bukan yang lain?

Jim B
sumber

Jawaban:

105

Mereka adalah hal yang sama. Jika Anda menggunakan set transaction isolation levelpernyataan, itu akan berlaku untuk semua tabel dalam koneksi, jadi jika Anda hanya ingin nolockdi satu atau dua tabel gunakan itu; jika tidak gunakan yang lain.

Keduanya akan memberi Anda bacaan kotor. Jika Anda setuju dengan itu, maka gunakanlah. Jika Anda tidak dapat memiliki bacaan kotor, maka pertimbangkan snapshotatau serializablepetunjuk sebagai gantinya.

HLGEM
sumber
Pertimbangkan REPEATABLE READdaripada SERIALIZABLEjika Anda tidak peduli dengan data hantu. SERIALIZABLESANGAT membatasi dan hampir tidak boleh digunakan (kecuali misalnya dalam beberapa aplikasi keuangan penting).
Kryptos
10
  • NOLOCK bersifat lokal ke tabel (atau tampilan, dll.)
  • READ UNCOMMITTED adalah per sesi / koneksi

Adapun pedoman ... pencarian acak dari StackOverflow dan interweb listrik ...

gbn
sumber
Tautan terakhir "Mengapa menggunakan NOLOCK itu buruk .." sudah tidak ada lagi.
sangam
1
interweb listrik tak ternilai harganya. terima kasih telah menambahkan sedikit sinar matahari ke hari saya.
JJS
9

Sepengetahuan saya, satu-satunya perbedaan adalah cakupan efek seperti yang dikatakan Strommy. NOLOCK petunjuk di atas meja dan BACA TIDAK DIKOMITKAN pada sesi.

Mengenai masalah yang bisa terjadi, itu semua tentang konsistensi. Jika Anda peduli maka ketahuilah bahwa Anda bisa mendapatkan apa yang disebut pembacaan kotor yang dapat memengaruhi data lain yang dimanipulasi pada informasi yang salah.

Saya pribadi tidak berpikir saya telah melihat masalah apa pun dari ini tetapi itu mungkin lebih karena cara saya menggunakan nolock. Anda perlu menyadari bahwa ada skenario yang tidak masalah untuk digunakan. Skenario di mana Anda sebagian besar menambahkan data baru ke tabel tetapi memiliki proses lain yang datang untuk memeriksa skenario data. Itu mungkin akan baik-baik saja karena aliran utama tidak termasuk kembali dan memperbarui baris selama pembacaan.

Juga saya percaya bahwa hari ini Anda harus melihat ke Multi-versi Concurrency Control. Saya yakin mereka menambahkannya pada tahun 2005 dan ini membantu menghentikan penulis dari memblokir pembaca dengan memberikan cuplikan database kepada pembaca untuk digunakan. Saya akan menyertakan tautan dan menyerahkan penelitian lebih lanjut kepada pembaca:

MVCC

Tingkat Isolasi Database

Sean Copenhaver
sumber
+1 Meskipun saya tidak membahas aspek "haruskah Anda" dari READ_UNCOMMITTED ", Sean menutupinya dengan baik. Ada juga kasus di mana Anda dapat membaca baris yang sama dua kali di SQL Server (karena pemisahan halaman).
Anon246
6

Anda tidak dapat menggunakan Set Transaction Isolation Level Read Uncommitted in a View (Anda hanya dapat memiliki satu skrip di sana sebenarnya), jadi Anda harus menggunakan (nolock) jika baris kotor harus disertakan.

Rez.Net
sumber
4

Karena Anda harus menggunakan WITH (NOLOCK) untuk setiap tabel, mungkin akan mengganggu jika menuliskannya di setiap klausa FROM atau JOIN. Namun ada alasan mengapa ini disebut sebagai bacaan "kotor". Jadi, Anda benar-benar harus tahu kapan Anda melakukannya, dan tidak menyetelnya sebagai default untuk cakupan sesi. Mengapa?

Melupakan WITH (NOLOCK) mungkin tidak mempengaruhi program Anda dengan cara yang sangat dramatis, namun melakukan pembacaan kotor di mana Anda tidak menginginkannya dapat membuat perbedaan dalam keadaan tertentu.

Jadi gunakan DENGAN (NOLOCK) jika data saat ini yang dipilih dibiarkan salah, karena mungkin akan diputar kembali nanti. Ini sebagian besar digunakan ketika Anda ingin meningkatkan kinerja, dan persyaratan pada konteks aplikasi Anda memungkinkannya mengambil risiko bahwa data yang tidak konsisten ditampilkan. Namun Anda atau seseorang yang bertanggung jawab harus mempertimbangkan pro dan kontra dari keputusan menggunakan WITH (NOLOCK).

Alex
sumber