Transaksi dan mekanisme untuk kontrol mereka

Transaksi


Transaksi adalah urutan operasi pada data yang memiliki awal dan akhir.


Transaksi adalah operasi baca dan tulis berurutan. Akhir transaksi dapat berupa menyimpan perubahan (komit, komit) atau membatalkan perubahan (rollback, rollback). Sehubungan dengan database, transaksi adalah serangkaian pertanyaan, yang diperlakukan sebagai permintaan tunggal.

Transaksi harus memenuhi properti ACID


Atomicity. Suatu transaksi dieksekusi sepenuhnya atau tidak dilakukan sama sekali.

Koherensi Di akhir transaksi, pembatasan yang diberlakukan pada data (misalnya, kendala dalam database) tidak boleh dilanggar. Konsistensi menyiratkan bahwa sistem akan ditransfer dari satu kondisi yang benar ke kondisi benar yang lain.

Isolasi. Transaksi yang dilakukan secara bersamaan tidak boleh saling memengaruhi, misalnya mengubah data yang digunakan oleh transaksi lain. Hasil dari transaksi paralel harus seolah-olah transaksi dilaksanakan secara berurutan.

Keberlanjutan. Setelah berkomitmen, perubahan tidak boleh hilang.

Log transaksi


Log menyimpan perubahan yang dilakukan oleh transaksi, memastikan atomicity dan stabilitas data jika terjadi kegagalan sistem


Log berisi nilai-nilai yang dimiliki data sebelum dan sesudah perubahan oleh transaksi. Strategi log Write-ahead mengharuskan Anda untuk menambahkan catatan nilai sebelumnya ke log, dan tentang nilai akhir setelah transaksi selesai. Dalam hal terjadi penghentian sistem secara tiba-tiba, database membaca log dalam urutan terbalik dan membuang perubahan yang dilakukan oleh transaksi. Setelah bertemu dengan transaksi yang terputus, database mengeksekusi dan membuat perubahan tentang hal itu dalam log. Sedang dalam keadaan pada saat kegagalan, database membaca log dalam urutan langsung dan mengembalikan perubahan yang dilakukan oleh transaksi. Dengan demikian, stabilitas transaksi yang telah dilakukan dan atomitas transaksi terputus dipertahankan.

Cukup menjalankan kembali transaksi yang salah tidak cukup untuk memulihkan.

Sebuah contoh Pengguna memiliki $ 500 di akun dan pengguna memutuskan untuk menarik mereka melalui ATM. Dua transaksi dilakukan. Yang pertama membaca nilai saldo dan jika ada cukup dana pada saldo, itu memberikan uang kepada pengguna. Yang kedua mengurangi jumlah yang dibutuhkan dari saldo. Misalkan sistem macet dan operasi pertama gagal, dan yang kedua gagal. Dalam hal ini, kami tidak dapat menerbitkan kembali uang kepada pengguna tanpa mengembalikan sistem ke kondisi semula dengan saldo positif.

Tingkat isolasi


Baca Berkomitmen


Masalah dengan pembacaan kotor adalah bahwa transaksi dapat membaca hasil antara dari transaksi lain.

Sebuah contoh Nilai awal saldo adalah $ 0. T1 menambahkan $ 50 ke saldo. T2 membaca nilai saldo ($ 50). T1 membatalkan perubahan dan berakhir. T2 melanjutkan eksekusi dengan data saldo yang salah.

Solusinya adalah Read Committed, yang melarang pembacaan data yang dimodifikasi oleh transaksi. Jika transaksi A telah mengubah beberapa kumpulan data, maka transaksi B, ketika mengakses data ini, terpaksa menunggu transaksi A.

Baca berulang


Masalah perubahan yang hilang (Lost Updates). T1 menyimpan perubahan atas perubahan ke T2.

Sebuah contoh Nilai saldo awal adalah $ 0 dan dua transaksi sekaligus mengisi saldo. T1 dan T2 membaca saldo $ 0. Kemudian T2 menambahkan $ 200 hingga $ 0 dan menyimpan hasilnya. T1 menambahkan $ 100 hingga $ 0 dan menyimpan hasilnya. Hasil total adalah $ 100, bukan $ 300.

Masalah baca yang tidak dapat diulang. Pembacaan berulang terhadap data yang sama menghasilkan nilai yang berbeda.

Sebuah contoh T1 membaca nilai saldo $ 0. Kemudian T2 menambahkan $ 50 ke saldo dan berakhir. T1 membaca data lagi dan mendeteksi perbedaan dengan hasil sebelumnya.

Baca Berulang memastikan bahwa pembacaan berulang akan menghasilkan hasil yang sama. Data yang dibaca oleh satu transaksi dilarang untuk diubah dalam transaksi lain sampai transaksi selesai. Jika transaksi A telah membaca beberapa kumpulan data, maka transaksi B, ketika mengakses data ini, terpaksa menunggu transaksi A.

Tertib Membaca (Serializable)


Phantom Baca Dua kueri yang memilih data dengan beberapa kondisi mengembalikan nilai yang berbeda.

Sebuah contoh T1 meminta jumlah semua pengguna yang saldonya lebih besar dari $ 0 tetapi kurang dari $ 100. T2 mengurangi $ 1 dari pengguna dengan saldo $ 101. T1 menjalankan kembali permintaan tersebut.

Pembacaan tertib (Serializable). Transaksi dilakukan sebagai sepenuhnya berurutan. Dilarang memperbarui dan menambahkan catatan yang tunduk pada ketentuan permintaan. Jika transaksi A meminta data dari seluruh tabel, maka seluruh tabel dibekukan untuk sisa transaksi hingga transaksi A.

Penjadwal


Menetapkan urutan operasi yang harus dilakukan dalam transaksi paralel


Memberikan tingkat isolasi yang ditentukan. Jika hasil operasi tidak tergantung pada pesanan mereka, maka operasi tersebut dapat diubah (Diijinkan). Perintah dibaca dan operasi pada data yang berbeda. Operasi baca-tulis dan tulis-tulis tidak komutatif. Tugas penjadwal adalah untuk mengganti operasi yang dilakukan oleh transaksi paralel sehingga hasil eksekusi setara dengan eksekusi transaksi berurutan.

Mekanisme Kontrol Concurrency


Optimis berdasarkan deteksi konflik dan resolusi, pesimis berdasarkan pencegahan konflik


Dengan pendekatan optimis, beberapa pengguna dapat memiliki salinan data mereka. Yang pertama yang menyelesaikan pengeditan menyimpan perubahan, sisanya harus menggabungkan perubahan. Algoritma optimis memungkinkan terjadinya konflik, tetapi sistem harus pulih dari konflik.

Dengan pendekatan pesimistis, pengguna pertama yang menangkap data mencegah orang lain menerima data. Jika konflik jarang terjadi, adalah bijaksana untuk memilih strategi optimis, karena memberikan tingkat paralelisme yang lebih tinggi.

Mengunci


Jika satu transaksi memiliki data yang diblokir, maka sisa transaksi harus mengakses data saat mengakses data.


Blok dapat ditumpangkan pada database, tabel, baris, atau atribut. Shared Lock (Shared Lock) dapat dikenakan pada data yang sama dengan beberapa transaksi, memungkinkan semua transaksi (termasuk yang dikenakan) membaca, melarang perubahan dan penangkapan eksklusif. Kunci Eksklusif dapat dikenakan hanya oleh satu transaksi, memungkinkan tindakan apa pun dari transaksi yang dikenakan, melarang tindakan apa pun oleh yang lain.

Kebuntuan adalah situasi ketika transaksi dalam mode siaga, berlangsung tanpa batas


Sebuah contoh Transaksi pertama menunggu rilis data yang ditangkap oleh yang kedua, sedangkan yang kedua menunggu rilis data yang ditangkap oleh yang pertama.

Solusi optimis untuk masalah kebuntuan memungkinkan terjadinya kebuntuan, tetapi kemudian mengembalikan sistem dengan memutar kembali salah satu transaksi yang terlibat dalam kebuntuan


Dengan frekuensi tertentu, pencarian deadlock dilakukan. Salah satu metode pendeteksian adalah dalam waktu, yaitu untuk mempertimbangkan bahwa kebuntuan terjadi jika transaksi terlalu lama. Ketika kebuntuan ditemukan, salah satu transaksi dibatalkan, yang memungkinkan transaksi lain yang terlibat dalam kebuntuan selesai. Pilihan korban dapat didasarkan pada nilai transaksi atau senioritas mereka (Skema Tunggu-Mati dan Tunggu-Luka).

Setiap transaksi T diberi TS stempel waktu yang berisi waktu mulai transaksi.

Tunggu Mati

Jika TS (Ti) < TS (Tj) , maka Ti menunggu, jika tidak Ti akan kembali dan mulai lagi dengan cap waktu yang sama.

Jika transaksi muda telah menangkap sumber daya dan yang lebih tua meminta sumber daya yang sama, maka transaksi yang lebih tua diizinkan untuk diharapkan. Jika transaksi yang lebih lama telah mengambil sumber daya, maka transaksi muda yang meminta sumber daya ini akan dibatalkan.

Luka-tunggu.

Jika TS (Ti) < TS (Tj) , maka Tj memutar kembali dan mulai lagi dengan cap waktu yang sama, jika tidak maka Ti akan menunggu.

Jika transaksi yang lebih muda telah menangkap sumber daya dan transaksi yang lebih lama meminta sumber daya yang sama, maka transaksi yang lebih muda akan dibatalkan. Jika transaksi yang lebih lama telah menangkap sumber daya, maka transaksi yang lebih muda yang meminta sumber daya ini diizinkan untuk menunggu. Pemilihan korban berdasarkan senioritas mencegah kebuntuan, tetapi memutar balik transaksi yang tidak dalam kondisi saling terkait. Masalahnya adalah bahwa transaksi dapat dibatalkan berkali-kali karena Transaksi yang lebih lama dapat menyimpan sumber daya untuk waktu yang lama.

Solusi pesimistis untuk masalah kebuntuan tidak memungkinkan transaksi untuk memulai eksekusi jika ada risiko kebuntuan


Untuk mendeteksi kebuntuan, grafik dibuat (grafik tunggu, grafik tunggu), simpul-simpulnya adalah transaksi, dan ujung-ujungnya diarahkan dari transaksi yang menunggu data dirilis ke transaksi yang menangkap data ini. Diyakini bahwa kebuntuan terjadi jika grafik diulang. Membangun grafik tunggu, terutama dalam database terdistribusi, adalah prosedur yang mahal.

Penguncian dua fase - mencegah kebuntuan dengan menangkap semua sumber daya yang digunakan oleh transaksi di awal transaksi dan melepaskannya di akhir


Semua operasi pemblokiran harus mendahului pembukaan kunci pertama. Ini memiliki dua fase - Fase Pertumbuhan di mana penangkapan terjadi dan Fase Penyusutan di mana pelepasan terjadi. Jika tidak mungkin untuk menangkap salah satu sumber daya, transaksi dimulai lagi. Ada kemungkinan bahwa suatu transaksi tidak dapat menangkap sumber daya yang diperlukan, misalnya, jika beberapa transaksi bersaing untuk sumber daya yang sama.

Komit dua fase memastikan bahwa komit dijalankan pada semua replika database


Setiap basis data berkontribusi informasi tentang data yang akan diubah ke log dan sesuai dengan koordinator OK (Tahap Voting). Setelah semua orang menjawab OK, koordinator mengirimkan sinyal yang mewajibkan semua orang untuk melakukan. Setelah melakukan server, mereka merespons OK, jika setidaknya satu tidak menjawab OK, maka koordinator mengirim sinyal untuk membatalkan perubahan ke semua server (Tahap Penyelesaian).

Metode cap waktu


Transaksi yang lebih lama dibatalkan saat mencoba mengakses data yang terlibat dalam transaksi yang lebih muda


Setiap transaksi diberi cap waktu TS yang sesuai dengan waktu mulai eksekusi. Jika Ti lebih tua dari Tj , maka TS (Ti) < TS (Tj) .

Ketika transaksi dibatalkan, ia diberi cap waktu baru. Setiap objek data Q yang terlibat dalam transaksi ditandai dengan dua label. W-TS (Q) adalah cap waktu transaksi termuda yang berhasil menulis ke Q. R-TS (Q) adalah cap waktu transaksi termuda yang menyelesaikan catatan baca di atas Q.

Ketika transaksi T meminta untuk membaca data Q , dua opsi dimungkinkan.

Jika TS (T) < W-TS (Q) , yaitu, data diperbarui oleh transaksi yang lebih muda, maka transaksi T kembali.

Jika TS (T) > = W-TS (Q) , maka pembacaan dilakukan dan R-TS (Q) menjadi MAX (R-TS (Q), TS (T)) .

Ketika transaksi T meminta perubahan dalam data Q , dua opsi dimungkinkan.

Jika TS (T) < R-TS (Q) , yaitu, data telah dibaca oleh transaksi yang lebih muda dan jika perubahan dilakukan, maka konflik akan muncul. Transaksi T memutar kembali.

Jika TS (T) < W-TS (Q) , yaitu, transaksi mencoba untuk menimpa nilai yang lebih baru, transaksi T memutar kembali. Dalam kasus lain, perubahan dilakukan dan W-TS (Q) menjadi sama dengan TS (T) .

Tidak diperlukan konstruksi grafik tunggu yang mahal. Transaksi lama bergantung pada yang baru, oleh karena itu tidak ada loop di kolom tunggu. Tidak ada deadlock, karena transaksi tidak diharapkan, tetapi dibatalkan segera. Tendangan Cascading dimungkinkan. Jika Ti memutar kembali, dan Tj membaca data bahwa Ti berubah, maka Tj juga harus memutar kembali. Jika, pada saat yang sama, Tj telah dikomunikasikan, maka akan ada pelanggaran prinsip stabilitas.

Salah satu solusi untuk mengembalikan rollback. Suatu transaksi melakukan semua operasi penulisan pada akhirnya, dan sisa transaksi harus menunggu selesainya operasi ini. Transaksi menunggu komitmen sebelum membaca.

Aturan tulis Thomas - variasi metode timestamp di mana data yang diperbarui oleh transaksi yang lebih muda tidak diizinkan untuk ditimpa oleh yang lebih lama


Transaksi T meminta perubahan data Q. Jika TS (T) < W-TS (Q) , yaitu, transaksi mencoba untuk menimpa nilai yang lebih baru, transaksi T tidak dibatalkan seperti dalam metode timestamp.

Source: https://habr.com/ru/post/id446662/


All Articles