Tingkat Isolasi Transaksi (ODBC)

Tingkat isolasi transaksi adalah ukuran sejauh mana isolasi transaksi berhasil. Secara khusus, tingkat isolasi transaksi didefinisikan oleh ada atau tidaknya fenomena berikut:

  • Kotor MembacaBacaan kotor terjadi ketika transaksi membaca data yang belum dilakukan. Misalnya, misalkan transaksi 1 memperbarui baris. Transaksi 2 membaca baris yang diperbarui sebelum transaksi 1 menerapkan pembaruan. Jika transaksi 1 mengembalikan perubahan, transaksi 2 akan memiliki data baca yang dianggap tidak pernah ada.

  • Pembacaan yang tidak dapat dipesan Pembacaan yang tidak dapat dipesan terjadi ketika transaksi membaca baris yang sama dua kali tetapi mendapatkan data yang berbeda setiap kali. Misalnya, misalkan transaksi 1 membaca baris. Transaksi 2 memperbarui atau menghapus baris tersebut dan menerapkan pembaruan atau penghapusan. Jika transaksi 1 dibaca ulang baris, transaksi akan mengambil nilai baris yang berbeda atau menemukan bahwa baris telah dihapus.

  • Phantoms A phantom adalah baris yang cocok dengan kriteria pencarian tetapi awalnya tidak terlihat. Misalnya, transaksi 1 membaca sekumpulan baris yang memenuhi beberapa kriteria pencarian. Transaksi 2 menghasilkan baris baru (melalui pembaruan atau sisipan) yang cocok dengan kriteria pencarian untuk transaksi 1. Jika transaksi 1 mengeksekusi ulang pernyataan yang membaca baris, transaksi akan mendapatkan sekumpulan baris yang berbeda.

Empat tingkat isolasi transaksi (sebagaimana didefinisikan oleh SQL-92) didefinisikan dalam hal fenomena ini. Dalam tabel berikut, "X" menandai setiap fenomena yang dapat terjadi.

Tingkat isolasi transaksi Pembacaan kotor Bacaan yang tidak dapat dipetik Hantu
Baca tidak dikomit X X X
Pembacaan yang diterapkan -- X X
Pembacaan berulang -- -- X
Serializable -- -- --

Tabel berikut menjelaskan cara sederhana agar DBMS dapat menerapkan tingkat isolasi transaksi.

Penting

Sebagian besar DBMS menggunakan skema yang lebih kompleks daripada ini untuk meningkatkan konkurensi. Contoh-contoh ini disediakan hanya untuk tujuan ilustrasi. Secara khusus, ODBC tidak meresepkan bagaimana DBMS tertentu mengisolasi transaksi satu sama lain.

Isolasi transaksi Kemungkinan implementasi
Baca tidak dikomit Transaksi tidak terisolasi satu sama lain. Jika DBMS mendukung tingkat isolasi transaksi lainnya, DBMS mengabaikan mekanisme apa pun yang digunakannya untuk mengimplementasikan tingkat tersebut. Agar tidak berdampak buruk pada transaksi lain, transaksi yang berjalan pada tingkat Baca Tidak Dikomit biasanya bersifat baca-saja.
Pembacaan yang diterapkan Transaksi menunggu hingga baris yang dikunci oleh transaksi lain tidak terkunci; ini mencegahnya membaca data "kotor".

Transaksi menyimpan kunci baca (jika hanya membaca baris) atau menulis kunci (jika memperbarui atau menghapus baris) pada baris saat ini untuk mencegah transaksi lain memperbarui atau menghapusnya. Transaksi melepaskan kunci baca saat berpindah dari baris saat ini. Ini menahan kunci tulis sampai diterapkan atau digulung balik.
Pembacaan berulang Transaksi menunggu hingga baris yang dikunci oleh transaksi lain tidak terkunci; ini mencegahnya membaca data "kotor".

Transaksi menyimpan kunci baca pada semua baris yang dikembalikannya ke aplikasi dan menulis kunci pada semua baris yang disisipkan, diperbarui, atau dihapus. Misalnya, jika transaksi menyertakan pernyataan SQL SELECT * FROM Orders, transaksi akan mengunci baris saat aplikasi mengambilnya. Jika transaksi menyertakan pernyataan SQL DELETE FROM Orders WHERE Status = 'CLOSED', transaksi akan mengunci baris saat menghapusnya.

Karena transaksi lain tidak dapat memperbarui atau menghapus baris ini, transaksi saat ini menghindari pembacaan yang tidak dapat dipecahkan. Transaksi melepaskan kuncinya ketika diterapkan atau digulung balik.
Serializable Transaksi menunggu hingga baris yang dikunci oleh transaksi lain tidak terkunci; ini mencegahnya membaca data "kotor".

Transaksi menyimpan kunci baca (jika hanya membaca baris) atau kunci tulis (jika dapat memperbarui atau menghapus baris) pada rentang baris yang terpengaruhnya. Misalnya, jika transaksi menyertakan pernyataan SQL SELECT * FROM Orders, rentangnya adalah seluruh tabel Pesanan; transaksi akan mengunci tabel dan tidak mengizinkan baris baru dimasukkan ke dalamnya. Jika transaksi menyertakan pernyataan SQL DELETE FROM Orders WHERE Status = 'CLOSED', rentangnya adalah semua baris dengan Status "CLOSED"; transaksi akan mengunci semua baris dalam tabel Pesanan dengan Status "TERTUTUP" dan tidak mengizinkan baris apa pun dimasukkan atau diperbarui sedih sehingga baris yang dihasilkan memiliki Status "TERTUTUP".

Karena transaksi lain tidak dapat memperbarui atau menghapus baris dalam rentang, transaksi saat ini menghindari pembacaan yang tidak dapat dipetik. Karena transaksi lain tidak dapat menyisipkan baris apa pun dalam rentang, transaksi saat ini menghindari phantom apa pun. Transaksi melepaskan kuncinya ketika diterapkan atau digulung balik.

Penting untuk dicatat bahwa tingkat isolasi transaksi tidak memengaruhi kemampuan transaksi untuk melihat perubahannya sendiri; transaksi selalu dapat melihat perubahan apa pun yang mereka buat. Misalnya, transaksi mungkin terdiri dari dua pernyataan UPDATE , yang pertama menaikkan gaji semua karyawan sebesar 10 persen dan yang kedua menetapkan pembayaran karyawan mana pun dengan jumlah maksimum hingga jumlah tersebut. Ini berhasil sebagai satu transaksi hanya karena pernyataan UPDATE kedua dapat melihat hasil yang pertama.