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:
- Penguncian dua fase (2PL)
Yang pertama adalah ketika transaksi T2 mencoba untuk mengubah record A, ia mengetahui bahwa transaksi T1 telah mengubah record A dan menunggu sampai transaksi T1 selesai karena transaksi T2 tidak dapat mengetahui apakah transaksi T1 akan dilakukan atau digulung. kembali. Metode ini disebut penguncian dua fase (2PL).
- Kontrol konkurensi multi-versi (MVCC)
Yang lainnya adalah mengizinkan masing-masing transaksi, T1 dan T2, untuk memiliki versi yang diubah sendiri. Bahkan ketika transaksi T1 telah mengubah catatan A dari 1 ke 2, transaksi T1 meninggalkan nilai asli 1 apa adanya dan menulis bahwa versi transaksi T1 dari catatan A adalah 2. Kemudian, transaksi T2 berikut mengubah catatan A. dari 1 ke 3, bukan dari 2 ke 4, dan menulis bahwa versi transaksi T2 dari rekam A adalah 3.
Saat transaksi T1 dibatalkan, tidak masalah jika 2, versi transaksi T1, tidak diterapkan ke catatan A. Setelah itu, jika transaksi T2 dilakukan, 3, versi transaksi T2, akan diterapkan ke record A. Jika transaksi T1 dilakukan sebelum transaksi T2, catatan A diubah menjadi 2, dan kemudian ke 3 pada saat melakukan transaksi T2. Status database akhir identik dengan status mengeksekusi setiap transaksi secara independen, tanpa berdampak pada transaksi lainnya. Oleh karena itu, ini memenuhi properti ACID. Metode ini disebut kontrol konkurensi multi-versi (MVCC).
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 :
Apakah kunci diambil saat data dibaca, dan jenis kunci apa yang diminta.
Berapa lama kunci baca ditahan.
Apakah operasi baca yang mereferensikan baris diubah oleh transaksi lain:
Blokir hingga kunci eksklusif di baris tersebut dibebaskan.
Ambil versi yang dikomit dari baris yang ada pada saat pernyataan atau transaksi dimulai.
Baca modifikasi data tidak terikat.
Memilih tingkat isolasi transaksi tidak mempengaruhi kunci yang diperoleh untuk melindungi modifikasi data. Transaksi selalu mendapatkan kunci eksklusif pada data apa pun yang diubah dan ditahannya kunci tersebut hingga transaksi selesai, terlepas dari tingkat isolasi yang disetel untuk transaksi itu. Untuk operasi baca, tingkat isolasi transaksi terutama menentukan tingkat perlindungan dari efek modifikasi yang dilakukan oleh transaksi lain.
Tingkat isolasi yang lebih rendah meningkatkan kemampuan banyak pengguna untuk mengakses data pada saat yang sama, tetapi meningkatkan jumlah efek konkurensi , seperti pembacaan kotor atau pembaruan yang hilang, yang mungkin ditemui pengguna.
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:
- Jika READ_COMMITTED_SNAPSHOT disetel ke OFF (default): menggunakan kunci bersama untuk mencegah transaksi lain mengubah baris saat transaksi saat ini menjalankan operasi baca. Kunci bersama juga memblokir pernyataan dari membaca baris yang diubah oleh transaksi lain sampai transaksi lain selesai. [...] Kunci baris dilepaskan sebelum baris berikutnya diproses. [...]
- Jika READ_COMMITTED_SNAPSHOT diatur ke ON, Database Engine menggunakan versi baris untuk menyajikan setiap pernyataan dengan snapshot data yang konsisten secara transaksional seperti yang ada di awal pernyataan. Kunci tidak digunakan untuk melindungi data dari pembaruan oleh transaksi lain.
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.