Saya pikir tingkat isolasi di atas sangat mirip. Bisakah seseorang tolong jelaskan dengan beberapa contoh bagus apa perbedaan utamanya?
Saya pikir tingkat isolasi di atas sangat mirip. Bisakah seseorang tolong jelaskan dengan beberapa contoh bagus apa perbedaan utamanya?
Jawaban:
Komitmen baca adalah tingkat isolasi yang menjamin bahwa setiap data yang dibaca dilakukan saat ini dibaca. Ini hanya membatasi pembaca dari melihat bacaan perantara, tidak berkomitmen, 'kotor'. Tidak ada janji sama sekali bahwa jika transaksi menerbitkan kembali baca, akan menemukan data yang sama , data bebas untuk diubah setelah dibaca.
Pembacaan berulang adalah tingkat isolasi yang lebih tinggi, bahwa selain jaminan tingkat yang sudah dibaca, juga menjamin bahwa setiap pembacaan data tidak dapat berubah , jika transaksi membaca data yang sama lagi, itu akan menemukan data yang sebelumnya dibaca di tempat, tidak berubah. , dan tersedia untuk dibaca.
Tingkat isolasi berikutnya, serializable, membuat jaminan lebih kuat: selain semua jaminan baca berulang, itu juga menjamin bahwa tidak ada data baru yang dapat dilihat oleh pembacaan berikutnya.
Katakanlah Anda memiliki tabel T dengan kolom C dengan satu baris di dalamnya, katakan memiliki nilai '1'. Dan anggap Anda memiliki tugas sederhana seperti berikut:
BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;
Itu adalah tugas sederhana yang mengeluarkan dua bacaan dari tabel T, dengan penundaan 1 menit di antara mereka.
Jika Anda mengikuti logika di atas, Anda dapat dengan cepat menyadari bahwa transaksi SERIALIZABLE, walaupun dapat membuat hidup Anda lebih mudah, selalu sepenuhnya memblokir setiap operasi bersamaan yang mungkin, karena mereka mengharuskan tidak ada yang dapat memodifikasi, menghapus, atau menyisipkan baris apa pun. Tingkat isolasi transaksi default dari System.Transactions
ruang lingkup .Net adalah serializable, dan ini biasanya menjelaskan kinerja luar biasa yang dihasilkan.
Dan akhirnya, ada juga level isolasi SNAPSHOT. Level isolasi SNAPSHOT membuat jaminan yang sama dengan serializable, tetapi tidak dengan mensyaratkan bahwa tidak ada transaksi konkuren yang dapat memodifikasi data. Alih-alih, ia memaksa setiap pembaca untuk melihat versinya sendiri di dunia (ini adalah 'snapshot'). Ini membuatnya sangat mudah untuk diprogram dan juga sangat terukur karena tidak memblokir pembaruan secara bersamaan. Namun, manfaat itu datang dengan harga: konsumsi sumber daya server tambahan.
Tambahan berbunyi:
Keadaan basis data dipertahankan sejak awal transaksi. Jika Anda mengambil nilai di session1, lalu perbarui nilai itu di session2, mengambilnya lagi di session1 akan mengembalikan hasil yang sama. Membaca berulang.
session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron
Dalam konteks transaksi, Anda akan selalu mengambil nilai komitmen terbaru. Jika Anda mengambil nilai di session1, perbarui di session2, lalu ambil di session1again, Anda akan mendapatkan nilai seperti yang diubah di session2. Bunyinya baris berkomitmen terakhir.
session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;
session1> SELECT firstname FROM names WHERE id = 7;
Bob
Masuk akal?
Cukup jawaban sesuai dengan bacaan dan pemahaman saya pada utas ini dan jawaban @ remus-rusanu didasarkan pada skenario sederhana ini:
Ada dua proses A dan B. Proses B membaca Tabel X Proses A menulis dalam tabel X Proses B membaca lagi Tabel X.
Pertanyaan lama yang sudah memiliki jawaban yang diterima, tapi saya suka memikirkan dua level isolasi ini dalam hal bagaimana mereka mengubah perilaku penguncian dalam SQL Server. Ini mungkin bermanfaat bagi mereka yang men-debug deadlock seperti saya.
BACA BERKOMITMEN (default)
Kunci bersama diambil dalam SELECT dan kemudian dirilis ketika pernyataan SELECT selesai . Ini adalah bagaimana sistem dapat menjamin bahwa tidak ada pembacaan kotor dari data yang tidak dikomit. Transaksi lain masih dapat mengubah baris yang mendasari setelah SELECT Anda selesai dan sebelum transaksi Anda selesai.
BACA ULANG
Kunci bersama diambil dalam SELECT dan kemudian dirilis hanya setelah transaksi selesai . Ini adalah bagaimana sistem dapat menjamin bahwa nilai yang Anda baca tidak akan berubah selama transaksi (karena mereka tetap terkunci sampai transaksi selesai).
Mencoba menjelaskan keraguan ini dengan diagram sederhana.
Komitmen Baca: Di sini, di level isolasi ini, Transaksi T1 akan membaca nilai terbaru dari X yang dilakukan oleh Transaksi T2.
Baca Berulang: Di tingkat isolasi ini, Transaksi T1 tidak akan mempertimbangkan perubahan yang dilakukan oleh Transaksi T2.
Saya pikir gambar ini juga dapat berguna, ini membantu saya sebagai referensi ketika saya ingin cepat mengingat perbedaan antara tingkat isolasi (terima kasih kepada kudvenkat di youtube)
Harap dicatat bahwa, yang berulang dalam hal membaca berulang untuk tupel, tetapi tidak untuk seluruh tabel. Dalam tingkat isolasi ANSC, phantom read anomaly dapat terjadi, yang berarti membaca tabel dengan yang sama di mana klausa dua kali dapat mengembalikan hasil yang berbeda. Secara harfiah, itu tidak dapat diulang .
Pengamatan saya pada solusi awal yang diterima.
Di bawah RR (default mysql) - Jika tx terbuka dan SELECT telah dipecat, tx lain TIDAK dapat menghapus baris apa pun yang termasuk hasil BACA sebelumnya yang ditetapkan hingga tx sebelumnya dilakukan (pada kenyataannya pernyataan penghapusan di tx baru hanya akan hang) , namun tx berikutnya dapat menghapus semua baris dari tabel tanpa masalah. Btw, BACA berikutnya di tx sebelumnya masih akan melihat data lama sampai berkomitmen.