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?
sql
sql-server
sql-server-2005
Jim B
sumber
sumber
REPEATABLE READ
daripadaSERIALIZABLE
jika Anda tidak peduli dengan data hantu.SERIALIZABLE
SANGAT membatasi dan hampir tidak boleh digunakan (kecuali misalnya dalam beberapa aplikasi keuangan penting).DENGAN (NOLOCK) adalah petunjuk tentang level tabel. Menyetel level isolasi transaksi ke READ_UNCOMMITTED akan mempengaruhi koneksi. Perbedaannya terletak pada ruang lingkupnya. Lihat READUNCOMMITTED dan NOLOCK dalam dokumentasi SQL Server di sini:
http://technet.microsoft.com/en-us/library/ms187373.aspx
Untuk TRANSACTION ISOLATION LEVEL: http://technet.microsoft.com/en-us/library/ms173763.aspx
sumber
Adapun pedoman ... pencarian acak dari StackOverflow dan interweb listrik ...
sumber
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
sumber
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.
sumber
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).
sumber