Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Hai semua. Vladislav Rodin sedang berhubung. Saya kini merupakan Ketua Kursus untuk kursus Arkitek Beban Kerja Tinggi di OTUS dan juga mengajar kursus seni bina perisian.

Sebagai tambahan kepada pengajaran, seperti yang anda mungkin perasan, saya sedang menulis bahan asal untuk blog OTUS di HabrΓ© dan saya ingin bertepatan dengan artikel hari ini bertepatan dengan pelancaran kursus "PostgreSQL", yang dibuka untuk pendaftaran sekarang.

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Pengenalan

Π’ kali terakhir kami bercakap tentang hakikat bahawa transaksi dalam pangkalan data berfungsi untuk menyelesaikan dua masalah: memastikan toleransi kesalahan dan akses kepada data dalam persekitaran yang kompetitif. Untuk melaksanakan tugas ini sepenuhnya, transaksi mesti mempunyai sifat ACID. Hari ini kita akan bercakap secara terperinci mengenai surat itu saya (pengasingan) dalam singkatan ini.

Insulation

Pengasingan menyelesaikan masalah mengakses data dalam persekitaran yang kompetitif, pada asasnya memberikan perlindungan daripada keadaan perlumbaan. Sebaik-baiknya, pengasingan bermaksud siri, yang merupakan sifat yang memastikan bahawa hasil daripada melaksanakan transaksi secara selari adalah sama seolah-olah ia dilaksanakan secara berurutan. Masalah utama dengan harta ini ialah sangat sukar untuk disediakan secara teknikal dan, akibatnya, mempunyai kesan yang ketara terhadap prestasi sistem. Itulah sebabnya pengasingan sering menjadi lemah, menerima risiko anomali tertentu, yang akan dibincangkan di bawah. Kemungkinan anomali tertentu berlaku dengan tepat mencirikan tahap pengasingan transaksi.

Anomali yang paling terkenal ialah: bacaan kotor, bacaan tidak berulang, bacaan hantu, tetapi sebenarnya terdapat 5 lagi: tulis kotor, kemas kini hilang kursor, kemas kini hilang, baca condong, tulis condong.

Tulisan kotor

Intipati anomali ialah transaksi boleh menimpa data yang tidak dikomit.

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Anomali ini berbahaya bukan sahaja kerana data boleh bercanggah selepas melakukan kedua-dua transaksi (seperti dalam gambar), tetapi juga kerana atomicity dilanggar: memandangkan kami membenarkan data yang tidak komited ditimpa, tidak jelas cara untuk melancarkan satu transaksi tanpa menjejaskan yang lain. .

Anomali boleh dirawat dengan mudah: kami melampirkan kunci pada rekod sebelum memulakan rakaman, melarang transaksi lain daripada menukar rekod sehingga kunci dikeluarkan.

Bacaan kotor

Bacaan kotor bermaksud membaca data tanpa komitmen.

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Masalah timbul apabila tindakan atau keputusan perlu dibuat berdasarkan sampel.

Untuk membetulkan anomali, anda boleh melampirkan kunci baca, tetapi ini akan memberi kesan besar kepada prestasi. Adalah lebih mudah untuk mengatakan bahawa untuk transaksi rollback, keadaan awal data (sebelum permulaan rakaman) mesti disimpan dalam sistem. Mengapa tidak membaca dari sana? Ia cukup murah sehingga kebanyakan pangkalan data mengalih keluar bacaan kotor secara lalai.

Kemas kini hilang

Kemas kini yang hilang bermakna kemas kini yang hilang, dan terjemahan itu menggambarkan intipati masalah dengan agak tepat:

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Malah, hasil transaksi T2 telah diterbalikkan. Keadaan ini boleh diperbetulkan dengan kunci tulis tersurat atau tersirat. Iaitu, kami sama ada hanya mengemas kini rekod, dan kemudian kunci tersirat berlaku, atau kami melakukan pilih untuk kemas kini, menyebabkan kunci baca dan tulis berlaku. Sila ambil perhatian bahawa operasi sedemikian agak berbahaya: dengan bacaan "tidak bersalah" kami, kami menyekat bacaan lain. Sesetengah pangkalan data menawarkan lebih selamat pilih untuk dikongsi, membenarkan data dibaca tetapi tidak diubah suai.

Kursor hilang kemas kini

Untuk kawalan yang lebih halus, pangkalan mungkin menawarkan alat lain, seperti kursor. Kursor ialah struktur yang mengandungi satu set baris dan membolehkan anda mengulanginya. isytiharkan cursor_name untuk select_statement. Kandungan kursor diterangkan dengan pilih.

Mengapa anda memerlukan kursor? Hakikatnya ialah sesetengah pangkalan data menawarkan kunci pada semua rekod yang dipilih oleh pilihan (kestabilan baca), atau hanya pada rekod yang kursor berada pada masa ini (kestabilan kursor). Dengan kestabilan kursor, kunci pendek dilaksanakan, yang membolehkan kami mengurangkan bilangan kunci jika kami mengulangi sampel data yang besar. Oleh itu, anomali kemas kini yang hilang diasingkan secara berasingan untuk kursor.

Bacaan tidak boleh berulang

Bacaan tidak boleh diulang ialah semasa pelaksanaan transaksi kami, 2 bacaan berturut-turut bagi rekod yang sama akan membawa kepada hasil yang berbeza, kerana transaksi lain campur tangan antara kedua-dua bacaan ini, menukar data kami dan telah dilakukan.

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Mengapa ini menjadi masalah? Bayangkan matlamat transaksi T2 dalam gambar adalah untuk memilih semua barangan yang harganya kurang daripada 150 USD. Orang lain mengemas kini harga kepada $200. Oleh itu, penapis yang dipasang tidak berfungsi.

Anomali ini tidak lagi berlaku apabila saling kunci dua fasa ditambah atau apabila mekanisme MVCC digunakan, yang saya ingin bincangkan secara berasingan.

Bacaan hantu

Phantom ialah bacaan data yang telah ditambahkan oleh transaksi lain.

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Sebagai contoh, kita boleh melihat pemilihan produk paling murah yang salah apabila anomali ini berlaku.

Menghilangkan bacaan hantu sudah agak sukar. Sekatan biasa tidak mencukupi, kerana kita tidak boleh menyekat sesuatu yang belum wujud. Sistem 2PL menggunakan penguncian ramalan, manakala sistem MVCC mempunyai penjadual transaksi yang melancarkan transaksi yang mungkin terganggu oleh sisipan. Kedua-dua mekanisme pertama dan kedua agak berat.

Baca senget

Read skew berlaku apabila kita bekerja dengan beberapa jadual, yang kandungannya mesti berubah secara konsisten.

Katakan kita mempunyai jadual yang mewakili siaran dan maklumat metanya:

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Satu transaksi membaca daripada jadual, yang lain mengubah suainya:

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Hasil daripada transaksi T1, siaran mempunyai tajuk = Baik, dan dikemas kini_oleh = T2, yang merupakan sejenis ketidakkonsistenan.

Sebenarnya, ini adalah bacaan yang tidak boleh diulang, tetapi sebagai sebahagian daripada beberapa jadual.

Untuk membetulkannya, T1 boleh meletakkan kunci pada semua baris yang akan dibacanya, yang akan menghalang transaksi T2 daripada menukar maklumat. Dalam kes MVCC, transaksi T2 akan dibatalkan. Perlindungan terhadap anomali ini boleh menjadi penting jika kita menggunakan kursor.

Tulis condong

Anomali ini juga lebih mudah untuk dijelaskan dengan contoh: anggap dalam sistem kami sekurang-kurangnya seorang doktor harus bertugas, tetapi kedua-dua doktor memutuskan untuk membatalkan tugas mereka:

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Anomali itu bermakna tiada seorang pun doktor akan bertugas. Mengapa ini berlaku? Kerana urus niaga itu menyemak syarat yang boleh dilanggar oleh transaksi lain dan disebabkan pengasingan kami tidak melihat perubahan ini.

Ini adalah bacaan tidak boleh berulang yang sama. Sebagai alternatif, pilihan boleh meletakkan kunci pada rekod ini.

Tulis condong dan baca condong adalah gabungan daripada anomali sebelumnya. Anda boleh mempertimbangkan menulis condong, yang pada asasnya adalah bacaan hantu. Pertimbangkan jadual yang mengandungi nama pekerja, gaji mereka dan projek yang mereka kerjakan:

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Apakah yang boleh terhasil daripada melemahkan tahap pengasingan transaksi dalam pangkalan data?

Hasilnya, kami mendapat gambaran berikut: setiap pengurus berpendapat bahawa perubahan mereka tidak akan membawa kepada melampaui belanjawan, jadi mereka membuat perubahan kakitangan yang bersama-sama membawa kepada lebihan kos.

Punca masalah adalah sama seperti dalam bacaan hantu.

Penemuan

Melonggarkan tahap pengasingan transaksi dalam pangkalan data adalah pertukaran antara keselamatan dan prestasi; pilihan tahap ini harus didekati berdasarkan potensi risiko kepada perniagaan jika anomali tertentu berlaku.

Ketahui lebih lanjut tentang kursus.

Sumber: www.habr.com

Tambah komen