1.1 Pendahuluan
Dan sekarang kesenangan dimulai - teori tentang cara kerja transaksi. Bagaimana agar sistem tetap berfungsi saat Anda mengubah data yang sama di utas yang berbeda? Atau apakah Anda ingin menjalankan satu transaksi di transaksi lain? Kami akan mulai mencari jawaban atas pertanyaan-pertanyaan ini dengan mempelajari isolasi transaksi ...
Tingkat isolasi transaksi adalah nilai bersyarat yang menentukan sejauh mana, sebagai akibat dari eksekusi transaksi paralel logis dalam DBMS, data yang tidak konsisten diperbolehkan. Skala tingkat isolasi transaksi berisi sejumlah nilai, diurutkan dari yang terendah hingga tertinggi; tingkat isolasi yang lebih tinggi sesuai dengan konsistensi data yang lebih baik, tetapi penggunaannya dapat mengurangi jumlah transaksi paralel secara fisik.
Sebaliknya, tingkat isolasi yang lebih rendah memungkinkan lebih banyak transaksi paralel, tetapi mengurangi akurasi data. Dengan demikian, memilih tingkat isolasi transaksi yang digunakan, pengembang sistem informasi, sampai batas tertentu, memberikan pilihan antara kecepatan kerja dan memastikan konsistensi data yang diterima dari sistem.
Masalah akses bersamaan menggunakan transaksi
Ketika transaksi dijalankan secara paralel, masalah berikut mungkin terjadi:
- pembaruan yang hilang - jika satu blok data diubah secara bersamaan oleh transaksi yang berbeda, semua perubahan akan hilang, kecuali yang terakhir;
- pembacaan "kotor" (eng. Dirty read) - membaca data yang ditambahkan atau diubah oleh transaksi, yang selanjutnya tidak akan dikonfirmasi (diputar kembali);
- pembacaan yang tidak dapat diulang (eng. pembacaan yang tidak dapat diulang) - saat membaca ulang dalam transaksi yang sama, data yang dibaca sebelumnya diubah;
- phantom reads - satu transaksi selama pelaksanaannya beberapa kali memilih banyak baris sesuai dengan kriteria yang sama. Transaksi lain di antara pengambilan ini menambahkan baris atau mengubah kolom dari beberapa baris yang digunakan dalam kriteria pengambilan transaksi pertama dan berakhir dengan sukses. Akibatnya, ternyata pilihan yang sama pada transaksi pertama memberikan rangkaian baris yang berbeda.
Pertimbangkan situasi di mana masalah ini dapat terjadi.
1.2 Pembaruan yang hilang
Situasi ketika, ketika satu blok data diubah secara bersamaan oleh transaksi yang berbeda, salah satu perubahannya hilang.
Misalkan ada dua transaksi yang berjalan pada saat yang sama:
Transaksi 1 | Transaksi 2 |
---|---|
UPDATE tbl1 SET f2=f2+20 DI MANA f1=1; | UPDATE tbl1 SET f2=f2+25 DI MANA f1=1; |
Dalam kedua transaksi, nilai bidang f2 berubah, setelah selesai, nilai bidang harus dinaikkan sebesar 45. Bahkan, urutan tindakan berikut dapat terjadi:
- Kedua transaksi secara bersamaan membaca keadaan lapangan saat ini. Konkurensi fisik yang tepat tidak diperlukan di sini, cukup operasi baca kedua agar selesai sebelum transaksi lain menulis hasilnya.
- Kedua transaksi menghitung nilai kolom baru dengan menambahkan masing-masing 20 dan 25 ke nilai yang dibaca sebelumnya.
- Transaksi mencoba menulis kembali hasil perhitungan ke field f2. Karena secara fisik tidak mungkin untuk melakukan dua penulisan pada saat yang sama, pada kenyataannya salah satu operasi tulis akan dilakukan lebih awal, yang lainnya nanti. Operasi tulis kedua akan menimpa hasil yang pertama.
Akibatnya, nilai bidang f2, setelah menyelesaikan kedua transaksi, dapat meningkat bukan sebesar 45, tetapi sebesar 20 atau 25, yaitu salah satu transaksi yang mengubah data akan "menghilang".
1.3 Bacaan "Kotor".
Membaca data yang ditambahkan atau diubah oleh transaksi yang nantinya akan gagal dilakukan (rollback).
Misalkan kita memiliki dua transaksi yang dibuka oleh aplikasi berbeda yang menjalankan pernyataan SQL berikut:
Transaksi 1 | Transaksi 2 |
---|---|
UPDATE tbl1 SET f2=f2+1 DI MANA f1=1; | |
PILIH f2 DARI tbl1 MANA f1=1; | |
PEKERJAAN ROLLBACK; |
Pada transaksi 1, nilai field f2 diubah, dan kemudian pada transaksi 2, nilai field ini dipilih. Setelah itu, transaksi 1 dibatalkan, akibatnya nilai yang diterima oleh transaksi kedua akan berbeda dengan nilai yang tersimpan di database.
1.4 Pembacaan yang tidak dapat diulang
Situasi ketika, ketika membaca ulang dalam transaksi yang sama, data yang dibaca sebelumnya berubah.
Misalkan kita memiliki dua transaksi yang dibuka oleh aplikasi berbeda yang menjalankan pernyataan SQL berikut:
Transaksi 1 | Transaksi 2 |
---|---|
PILIH f2 DARI tbl1 MANA f1=1; | |
UPDATE tbl1 SET f2=f2+3 DI MANA f1=1; | |
MELAKUKAN; | |
PILIH f2 DARI tbl1 MANA f1=1; |
Pada transaksi 2, nilai field f2 dipilih, kemudian pada transaksi 1, nilai field f2 diubah. Jika Anda mencoba lagi untuk memilih nilai dari bidang f2 dalam transaksi 2, hasil yang berbeda akan diperoleh. Situasi ini sangat tidak dapat diterima ketika data dibaca untuk dimodifikasi sebagian dan ditulis kembali ke database.
1.5 Membaca "hantu"
Situasi ketika, selama pembacaan berulang dalam transaksi yang sama, pilihan yang sama memberikan rangkaian baris yang berbeda.
Misalkan ada dua transaksi yang dibuka oleh aplikasi berbeda yang menjalankan pernyataan SQL berikut:
Transaksi 1 | Transaksi 2 |
---|---|
PILIH JUMLAH(f2) DARI tbl1; | |
INSERT INTO tbl1 (f1,f2) NILAI(15,20); | |
MELAKUKAN; | |
PILIH JUMLAH(f2) DARI tbl1; |
Transaksi 2 mengeksekusi pernyataan SQL yang menggunakan semua nilai bidang f2. Kemudian baris baru disisipkan pada transaksi 1, menyebabkan eksekusi ulang pernyataan SQL pada transaksi 2 menghasilkan hasil yang berbeda. Situasi ini disebut membaca hantu (phantom reading). Ini berbeda dengan pembacaan non-repeatable dimana hasil akses data berulang berubah bukan karena perubahan/penghapusan data itu sendiri, tetapi karena munculnya data baru (hantu).
GO TO FULL VERSION