Dalam bahasa Inggris yang sederhana, apa kerugian dan kelebihan menggunakan
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
dalam permintaan untuk aplikasi .NET dan aplikasi layanan pelaporan?
sumber
Dalam bahasa Inggris yang sederhana, apa kerugian dan kelebihan menggunakan
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
dalam permintaan untuk aplikasi .NET dan aplikasi layanan pelaporan?
Tingkat isolasi ini memungkinkan pembacaan yang kotor. Satu transaksi dapat melihat perubahan yang tidak dikomit dilakukan oleh beberapa transaksi lainnya.
Untuk mempertahankan tingkat isolasi tertinggi, DBMS biasanya memperoleh kunci pada data, yang dapat mengakibatkan hilangnya konkurensi dan overhead penguncian yang tinggi. Level isolasi ini merilekskan properti ini.
Anda mungkin ingin membaca artikel WikipediaREAD UNCOMMITTED
untuk beberapa contoh dan bacaan lebih lanjut.
Anda juga mungkin tertarik untuk memeriksa artikel blog Jeff Atwood tentang bagaimana ia dan timnya mengatasi masalah kebuntuan di masa-masa awal Stack Overflow. Menurut Jeff:
Tetapi apakah
nolock
berbahaya? Bisakah Anda akhirnya membaca data yang tidak valid denganread uncommitted
pada? Ya, secara teori. Anda tidak akan menemukan kekurangan astronot arsitektur database yang mulai menjatuhkan sains ACID pada Anda dan semua tetapi menarik alarm kebakaran gedung ketika Anda memberi tahu mereka bahwa Anda ingin mencobanolock
. Memang benar: teorinya menakutkan. Tetapi inilah yang saya pikirkan: "Secara teori tidak ada perbedaan antara teori dan praktik. Dalam praktik ada."Saya tidak akan merekomendasikan menggunakan
nolock
sebagai umum "baik untuk apa yang Anda sakit" memperbaiki minyak ular untuk masalah kebuntuan database yang mungkin Anda miliki. Anda harus mencoba mendiagnosis sumber masalahnya terlebih dahulu.Namun dalam praktiknya menambah
nolock
pertanyaan yang benar-benar Anda ketahui sederhana, urusan hanya-baca tampaknya tidak pernah menimbulkan masalah ... Selama Anda tahu apa yang Anda lakukan.
Satu alternatif ke READ UNCOMMITTED
level yang mungkin ingin Anda pertimbangkan adalah READ COMMITTED SNAPSHOT
. Mengutip Jeff lagi:
Snapshots mengandalkan metode pelacakan perubahan data yang sama sekali baru ... lebih dari sekadar perubahan logis, itu memerlukan server untuk menangani data secara fisik berbeda. Setelah metode pelacakan perubahan data baru ini diaktifkan, metode ini akan membuat salinan, atau potret setiap perubahan data. Dengan membaca snapshot ini alih-alih data langsung pada saat pertikaian, Shared Locks tidak diperlukan lagi pada pembacaan, dan kinerja keseluruhan basis data dapat meningkat.
READ UNCOMMITTED
juga dapat menyebabkan Anda membaca baris dua kali, atau melewatkan seluruh baris . Jika pemisahan halaman terjadi saat Anda membaca, maka Anda dapat kehilangan seluruh data.WITH(NOLOCK)
seharusnya hanya digunakan jika keakuratan hasil tidak pentingIni bisa berguna untuk melihat perkembangan permintaan memasukkan panjang, membuat perkiraan kasar (suka
COUNT(*)
atau kasarSUM(*)
) dll.Dengan kata lain, hasil kueri baca kotor kembali baik-baik saja selama Anda memperlakukannya sebagai perkiraan dan tidak membuat keputusan penting berdasarkan pada mereka.
sumber
Kasus penggunaan favorit saya
read uncommited
adalah untuk men-debug sesuatu yang terjadi di dalam suatu transaksi.Mulai perangkat lunak Anda di bawah debugger, saat Anda melangkah melalui baris kode, itu membuka transaksi dan memodifikasi database Anda. Ketika kode dihentikan, Anda bisa membuka penganalisis kueri, mengatur tingkat isolasi tidak dibaca yang sudah dibaca dan membuat pertanyaan untuk melihat apa yang sedang terjadi.
Anda juga dapat menggunakannya untuk melihat apakah prosedur yang berjalan lama macet atau memperbarui database Anda dengan benar.
Sangat bagus jika perusahaan Anda suka membuat prosedur tersimpan yang terlalu rumit.
sumber
Keuntungannya adalah bisa lebih cepat dalam beberapa situasi. Kerugiannya adalah hasilnya bisa salah (data yang belum berkomitmen dapat dikembalikan) dan tidak ada jaminan bahwa hasilnya dapat diulang.
Jika Anda peduli tentang akurasi, jangan gunakan ini.
Informasi lebih lanjut tentang MSDN :
sumber
select
pernyataan tidak perlu menunggu untuk mendapatkan kunci bersama pada sumber daya yang dikunci secara eksklusif oleh transaksi lainnya.Kapan boleh digunakan
READ UNCOMMITTED
?Aturan praktis
Bagus : Laporan agregat besar menunjukkan total yang terus berubah.
Beresiko : Hampir semuanya.
Berita baiknya adalah bahwa sebagian besar laporan hanya baca termasuk dalam kategori Baik .
Lebih detail...
Ok untuk menggunakannya:
Itu mungkin mencakup sebagian besar dari apa yang akan dilakukan departemen Business Intelligence, katakanlah, SSR. Pengecualian tentu saja, adalah sesuatu dengan tanda $ di depannya. Banyak orang menghitung uang dengan lebih banyak semangat daripada diterapkan pada metrik inti terkait yang diperlukan untuk melayani pelanggan dan menghasilkan uang itu. (Saya menyalahkan akuntan).
Saat berisiko
Laporan apa pun yang turun ke tingkat detail. Jika detail itu diperlukan, biasanya itu menyiratkan bahwa setiap baris akan relevan dengan keputusan. Bahkan, jika Anda tidak dapat menarik subset kecil tanpa memblokir mungkin karena alasan yang baik sedang diedit.
Data historis. Ini jarang membuat perbedaan praktis tetapi sementara pengguna memahami terus-menerus mengubah data tidak bisa sempurna, mereka tidak merasakan hal yang sama tentang data statis. Bacaan kotor tidak akan menyakitkan di sini, tetapi bacaan ganda terkadang dapat terjadi. Karena Anda seharusnya tidak memiliki blok pada data statis, mengapa mengambil risiko?
Hampir semua yang memberi makan aplikasi yang juga memiliki kemampuan menulis.
Ketika bahkan skenario OK tidak OK.
NOLOCK
tabel tersebut untuk apa pun.sumber
read uncommitted
untuk aplikasi web ketika pengguna melihat beberapa kotak UI di mana akurasi data tidak begitu penting. Pengguna hanya ingin ikhtisar cepat catatan apa yang mungkin ada di sana, dan mungkin dengan beberapa paging, pengurutan & penyaringan. Hanya ketika pengguna mengklik tombol Edit, maka saya mencoba membaca catatan terbaru dengan tingkat isolasi yang lebih ketat. Tidakkah pendekatan seperti itu lebih baik dalam hal kinerja?select item from things with (UPDLOCK)
. Letakkan batas waktu cepat di sana sehingga jika tidak dapat memperoleh kunci dengan cepat itu memberi tahu pengguna itu sedang diedit. Itu akan membuat Anda aman tidak hanya dari pengguna tetapi juga pengembang. Satu-satunya masalah di sini adalah Anda harus mulai memikirkan batas waktu dan bagaimana Anda mengatasinya di UI.Mengenai pelaporan, kami menggunakannya pada semua kueri pelaporan kami untuk mencegah kueri merobohkan basis data. Kita dapat melakukan itu karena kita menarik data historis, bukan data yang terkini.
sumber
Gunakan READ_UNCOMMITTED dalam situasi di mana sumber sangat tidak mungkin berubah.
Jangan gunakan READ_UNCOMMITTED ketika Anda tahu bahwa sumber daya dapat berubah selama operasi pengambilan.
sumber
READ UNCOMMITTED
.READ UNCOMMITTED
sebagian besar situasi ketika data Anda sedang digunakan secara aktif dan Anda ingin mengurangi beban di server untuk menghindari kemungkinan deadlock dan rollback transaksi hanya karena beberapa pengguna yang dengan sembrono menyalahgunakan " Perbarui tombol di halaman web dengan datagrid. Pengguna yang melihat banyak catatan pada saat yang sama, biasanya tidak terlalu peduli jika data sedikit usang atau sebagian diperbarui. Hanya ketika pengguna akan mengedit catatan, maka Anda mungkin ingin memberinya data yang paling akurat.Ini akan memberi Anda bacaan kotor, dan menunjukkan kepada Anda transaksi yang belum dilakukan. Itu jawaban yang paling jelas. Saya tidak berpikir itu ide yang baik untuk menggunakan ini hanya untuk mempercepat bacaan Anda. Ada cara lain untuk melakukan itu jika Anda menggunakan desain basis data yang baik.
Juga menarik untuk dicatat apa yang tidak terjadi. BACA UNCOMMITTED tidak hanya mengabaikan kunci meja lainnya. Ini juga tidak menyebabkan kunci apa pun.
Pertimbangkan Anda membuat laporan besar, atau Anda memigrasikan data dari database Anda menggunakan pernyataan SELECT yang besar dan mungkin rumit. Ini akan menyebabkan kunci bersama yang dapat ditingkatkan menjadi kunci tabel bersama selama durasi transaksi Anda. Transaksi lain mungkin membaca dari tabel, tetapi pembaruan tidak mungkin. Ini mungkin ide yang buruk jika ini merupakan basis data produksi karena produksi mungkin berhenti sepenuhnya.
Jika Anda menggunakan READ UNCOMMITTED, Anda tidak akan menetapkan kunci bersama di atas meja. Anda dapat memperoleh hasil dari beberapa transaksi baru atau Anda mungkin tidak bergantung pada tabel data yang dimasukkan dan berapa lama transaksi SELECT Anda baca. Anda juga dapat memperoleh data yang sama dua kali jika misalnya terjadi perpecahan halaman (data akan disalin ke lokasi lain dalam file data).
Jadi, jika sangat penting bagi Anda agar data dapat disisipkan saat melakukan SELECT Anda, BACA TIDAK DIKETAHUI mungkin masuk akal. Anda harus mempertimbangkan bahwa laporan Anda mungkin mengandung beberapa kesalahan, tetapi jika didasarkan pada jutaan baris dan hanya beberapa dari mereka yang diperbarui saat memilih hasilnya, ini mungkin "cukup baik". Transaksi Anda juga dapat gagal semuanya karena keunikan baris mungkin tidak dijamin.
Cara yang lebih baik sama sekali adalah dengan menggunakan SNAPSHOT ISOLATION LEVEL tetapi aplikasi Anda mungkin perlu beberapa penyesuaian untuk menggunakan ini. Salah satu contohnya adalah jika aplikasi Anda mengambil kunci eksklusif pada satu baris untuk mencegah orang lain membacanya dan masuk ke mode edit di UI. SNAPSHOT ISOLATION LEVEL juga datang dengan penalti performa yang cukup besar (terutama pada disk). Tapi Anda bisa mengatasinya dengan melemparkan perangkat keras pada masalah. :)
Anda juga dapat mempertimbangkan memulihkan cadangan database untuk digunakan untuk melaporkan atau memuat data ke dalam gudang data.
sumber
Ini dapat digunakan untuk tabel sederhana, misalnya dalam tabel audit hanya sisipkan, di mana tidak ada pembaruan untuk baris yang ada, dan tidak ada fk ke tabel lain. Sisipan adalah sisipan sederhana, yang tidak memiliki atau sedikit kemungkinan rollback.
sumber
Saya selalu menggunakan READ UNCOMMITTED sekarang. Cepat dengan masalah yang paling sedikit. Saat menggunakan isolasi lain, Anda hampir selalu menemukan beberapa masalah Pemblokiran.
Selama Anda menggunakan bidang Peningkatan Otomatis dan memberikan sedikit lebih banyak perhatian untuk memasukkan maka Anda baik-baik saja, dan Anda bisa mengucapkan selamat tinggal pada masalah memblokir.
Anda dapat membuat kesalahan dengan READ UNCOMMITED tetapi sejujurnya, sangat mudah memastikan sisipan Anda adalah bukti penuh. Sisipan / Pembaruan yang menggunakan hasil dari pemilihan adalah satu-satunya hal yang perlu Anda perhatikan. (Gunakan BACA BERKOMITMEN di sini, atau pastikan pembacaan yang kotor tidak akan menyebabkan masalah)
Jadi, baca Dirty Reads (Khusus untuk laporan besar), perangkat lunak Anda akan berjalan lebih lancar ...
sumber
Committed
untuk memasukkan dan memperbarui. Adapun masalah lain ia juga menunjukkan kesadaran tentang masalah pemisah halaman dalam menyebutkan menggunakan kunci penambahan otomatis. Saya setuju dengannya bahwa hampir semua pelaporan langsung yang dibuat hanya untuk dibaca oleh manusia dapat menoleransi sedikit perbedaan di tempat desimal terakhir. Saya setuju ini cerita yang berbeda untuk daftar detail atau data yang ditakdirkan untuk dibaca dan diubah oleh mesin dan begitu pula Clive.