Saya telah membaca tentang 4 tingkat isolasi:
Isolation Level Dirty Read Nonrepeatable Read Phantom Read
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED -- Permitted Permitted
REPEATABLE READ -- -- Permitted
SERIALIZABLE -- -- --
Saya ingin memahami kunci yang dimiliki setiap isolasi transaksi di atas meja
READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)
di bawah ini adalah tiga fenomena yang dapat terjadi dalam isolasi transaksi
Dirty Read - no lock
Nonrepeatable Read - tidak ada pembacaan kotor sebagai penguncian data yang dilakukan
Phantom Read - mengunci blok sql (yang dipilih dengan menggunakan kueri pemilihan)
Saya ingin memahami di mana kita mendefinisikan tingkat isolasi ini: hanya di tingkat jdbc / hibernate atau di DB juga
PS: Saya telah melalui tautan di tingkat Isolasi di oracle , tetapi mereka terlihat canggung dan berbicara tentang basis data tertentu
java
transactions
isolation-level
Pelajar
sumber
sumber
Jawaban:
Misalnya, Anda memiliki 3 proses bersamaan A, B, dan C. A memulai transaksi, menulis data, dan melakukan / rollback (bergantung pada hasil). B hanya menjalankan
SELECT
pernyataan untuk membaca data. C membaca dan memperbarui data. Semua proses ini bekerja pada tabel T. yang sama.WHERE aField > 10 AND aField < 20
A memasukkan data yangaField
nilainya antara 10 dan 20, kemudian B membaca kembali data tersebut dan mendapatkan hasil yang berbeda.Menggunakan JDBC, Anda mendefinisikannya menggunakan
Connection#setTransactionIsolation
.Menggunakan Hibernate:
Dimana
Konfigurasi hibernate diambil dari sini (maaf, ini dalam bahasa Spanyol).
Ngomong-ngomong, Anda juga dapat menyetel level isolasi di RDBMS:
SET ISOLATION TO DIRTY READ
kalimat.)dan seterusnya ...
sumber
Seperti yang dikatakan brb tea, tergantung pada implementasi database dan algoritma yang mereka gunakan: MVCC atau Two Phase Locking.
CUBRID (RDBMS open source) menjelaskan ide dari dua algoritma ini:
MVCC memungkinkan modifikasi serentak dengan biaya overhead yang meningkat dalam memori (karena harus mempertahankan versi berbeda dari data yang sama) dan komputasi (di tingkat REPETEABLE_READ Anda tidak dapat kehilangan pembaruan sehingga harus memeriksa versi datanya, seperti Hiberate lakukan dengan Optimistick Locking ).
Dalam level isolasi Transaksi 2PL mengontrol hal-hal berikut :
Contoh konkret dari hubungan antara kunci dan tingkat isolasi di SQL Server (gunakan 2PL kecuali pada READ_COMMITED dengan READ_COMMITTED_SNAPSHOT = ON)
READ_UNCOMMITED: jangan mengeluarkan kunci bersama untuk mencegah transaksi lain mengubah data yang dibaca oleh transaksi saat ini. BACA transaksi yang TIDAK DIKONTRAK juga tidak diblokir oleh kunci eksklusif yang akan mencegah transaksi saat ini dari membaca baris yang telah dimodifikasi tetapi tidak dilakukan oleh transaksi lain. [...]
READ_COMMITED:
REPETEABLE_READ: Kunci bersama ditempatkan pada semua data yang dibaca oleh setiap pernyataan dalam transaksi dan ditahan sampai transaksi selesai.
SERIALIZABLE: Kunci rentang ditempatkan di kisaran nilai kunci yang cocok dengan kondisi pencarian dari setiap pernyataan yang dieksekusi dalam transaksi. [...] Kunci jangkauan ditahan sampai transaksi selesai.
sumber
Kunci selalu diambil pada level DB: -
Dokumen Resmi Oracle: - Untuk menghindari konflik selama transaksi, DBMS menggunakan kunci, mekanisme untuk memblokir akses oleh orang lain ke data yang sedang diakses oleh transaksi. (Perhatikan bahwa dalam mode komit otomatis, di mana setiap pernyataan adalah transaksi, kunci hanya ditahan untuk satu pernyataan.) Setelah kunci disetel, kunci tetap berlaku sampai transaksi dilakukan atau dibatalkan. Misalnya, DBMS dapat mengunci baris tabel sampai update telah dilakukan. Efek dari kunci ini adalah untuk mencegah pengguna mendapatkan pembacaan yang kotor, yaitu, membaca nilai sebelum dijadikan permanen. (Mengakses nilai yang diperbarui yang belum dilakukan dianggap sebagai bacaan kotor karena nilai tersebut dapat digulung kembali ke nilai sebelumnya. Jika Anda membaca nilai yang kemudian dibatalkan, Anda akan membaca nilai yang tidak valid. )
Bagaimana kunci ditetapkan ditentukan oleh apa yang disebut tingkat isolasi transaksi, yang dapat berkisar dari tidak mendukung transaksi sama sekali hingga mendukung transaksi yang memberlakukan aturan akses yang sangat ketat.
Salah satu contoh tingkat isolasi transaksi adalah TRANSACTION_READ_COMMITTED, yang tidak akan mengizinkan nilai untuk diakses sampai setelah itu dilakukan. Dengan kata lain, jika tingkat isolasi transaksi disetel ke TRANSACTION_READ_COMMITTED, DBMS tidak mengizinkan pembacaan kotor terjadi. Sambungan antarmuka mencakup lima nilai yang mewakili tingkat isolasi transaksi yang dapat Anda gunakan di JDBC.
sumber