Dalam temuduga, penemuduga hanya perlu bertanya tentang ACID MySQL, dan kemudian dia boleh segera membaca esei lapan bahagian (ada yang mungkin belum dapat menjawabnya). Apa yang lebih menjijikkan ialah ada penemuduga yang tidak mengikut rutin dan terus bertanya, bagaimana MySQL melaksanakan ACID?
Anda keliru Sejujurnya, soalan ini boleh menghalang 95% orang.
Hari ini, artikel ini membincangkan prinsip pelaksanaan ACID di bawah enjin MySQL InnoDB
Ia tidak terlalu menghuraikan pengetahuan asas seperti apa itu transaksi dan maksud tahap pengasingan.
Sebagai pangkalan data hubungan, bagaimanakah MySQL menjamin ACID berdasarkan enjin InnoDB yang paling biasa.
Mari kita bincangkan tentang pengasingan dahulu.
Tahap Pengasingan Selepas penyerahan, perubahan yang dibuat akan dilihat oleh transaksi lainBaca Berulang | Dalam transaksi, hasil pembacaan data yang sama sentiasa sama, tidak kira sama ada transaksi lain beroperasi pada data dan sama ada transaksi itu dilakukan. Tahap lalai InnoDB. |
Siri | Urus niaga dilaksanakan secara bersiri. Setiap bacaan memerlukan kunci perkongsian tahap jadual. |
Tahap pengasingan yang berbeza adalah untuk menyelesaikan masalah yang berbeza. Iaitu, bacaan kotor, bacaan hantu dan bacaan tidak boleh diulang.
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Baca tanpa komitmen | Boleh muncul | Boleh muncul | Boleh muncul |
Baca Dihantar | Tidak dibenarkan muncul | Bacaan berulang | Tidak Dibenarkan muncul |
Boleh muncul | |||
Siri | tidak dibenarkan | tidak dibenarkan | tidak dibenarkan |
Tahap pengasingan yang berbeza, bagaimana pengasingan dicapai, dan mengapa perkara yang berbeza tidak boleh mengganggu satu sama lain? Jawapannya ialah Locks dan MVCC.
Mula-mula mari kita bincangkan tentang kunci yang ada pada MySQL?
Dari segi kebutiran, ia bermaksud kunci meja, kunci halaman dan kunci baris. Kunci meja termasuk kunci dikongsi yang disengajakan, kunci eksklusif yang disengajakan, kunci meningkat sendiri, dsb. Kunci baris dilaksanakan pada peringkat enjin oleh setiap enjin. Tetapi tidak semua enjin menyokong kunci baris Contohnya, enjin MyISAM tidak menyokong kunci baris.
Dalam transaksi InnoDB, kunci baris dilaksanakan dengan mengunci entri indeks pada indeks. Ini bermakna InnoDB menggunakan kunci peringkat baris hanya apabila data diambil melalui keadaan indeks, jika tidak, kunci jadual digunakan. Kunci peringkat baris juga dibahagikan kepada dua jenis: kunci kongsi dan kunci eksklusif, serta kunci kongsi niat dan kunci eksklusif niat yang perlu diperoleh sebelum dikunci.
pilih...kunci dalam mod kongsi
Kunci. select...lock in share mode
加锁。insert、update、delete、for update
masukkan, kemas kini, padam, untuk kemas kini
Kunci. Kunci baris ditambah
apabila diperlukan, tetapi ia tidak dilepaskan serta-merta apabila ia tidak diperlukan lagi, tetapi ia tidak dikeluarkan sehingga tamat transaksi. Ini adalah protokol kunci dua fasa. 🎜🎜Kunci pada rekod baris tunggal akan sentiasa mengunci rekod indeks.
Gap Lock, fikirkan sebab baca phantom, sebenarnya row lock hanya boleh lock row, tapi bila masukkan rekod baru, apa yang perlu dikemaskini ialah "gap" antara rekod. Jadi tambah kunci jurang untuk menyelesaikan bacaan hantu.
Kunci Jurang + Kunci Rakam, dibiarkan terbuka dan tertutup.
Pengenalan umum kepada kunci bawah, anda boleh melihatnya. Dengan kunci, apabila transaksi menulis data, transaksi lain tidak boleh mendapatkan kunci tulis dan tidak boleh menulis data Ini memastikan pengasingan antara urus niaga pada tahap tertentu. Tetapi seperti yang dinyatakan sebelum ini, jika kunci tulis ditambah, mengapa transaksi lain juga boleh membaca data, bukankah kunci baca tidak boleh diperoleh? Seperti yang dinyatakan sebelum ini, dengan kunci, transaksi semasa tidak boleh mengubah suai data tanpa kunci tulis, tetapi ia masih boleh dibaca, walaupun baris data telah diubah suai dan diserahkan oleh transaksi lain, baris yang sama masih boleh dibaca berulang kali. Ini ialah MVCC, kawalan penukaran berbilang versi, Kawalan Koncurrency Berbilang Versi. Format storan rekod baris dalam Innodb, dengan beberapa medan tambahan: DATA_TRX_ID dan DATA_ROLL_PTR. buat asal log: Rekod log sebelum data diubah suai, yang akan diterangkan secara terperinci kemudian. dicipta pada permulaan setiap SQL dan mempunyai beberapa atribut penting: DATA_TRX_ID DATA_TRX_ID >= low_limit_id: MVCC
Rantai versi
undo log
. ReadView
Mulakan pertanyaanSekarang mulakan pertanyaan, pilihan datang dan satu baris data ditemui.
Menunjukkan bahawa data dijana selepas paparan baca semasa dibuat dan data tidak dipaparkan.
up_limit_id
Dengan kunci dan MVCC, pengasingan transaksi diselesaikan. Untuk mengembangkan di sini, adakah tahap RR lalai menyelesaikan bacaan hantu? Bacaan hantu biasanya menyasarkan MASUKKAN, dan sasaran tidak boleh berulang KEMASKINI.
perkara 1 | perkara 2 |
---|---|
mulakan | mulakan |
pilih * dari dept | |
- | masukkan ke dalam dept(name) values("A") |
- | commit |
update dept set name="B" | |
|
Kami menjangkakan ia menjadi
id name 1 A 2 B
Ia sebenarnya ternyata
id name 1 B 2 B
Malah, tahap pengasingan MySQL repeatable read tidak sepenuhnya menyelesaikan masalah pembacaan hantu, tetapi menyelesaikan masalah bacaan hantu semasa membaca data. Masih terdapat masalah bacaan hantu untuk operasi pengubahsuaian, yang bermaksud MVCC tidak teliti dalam menyelesaikan bacaan hantu.
Mari kita bercakap tentang atomicity. Seperti yang dinyatakan sebelum ini, buat asal log menggulung semula log. Pengasingan MVCC sebenarnya bergantung padanya untuk mencapai, seperti juga atomicity. Kunci untuk mencapai atomicity adalah untuk dapat membuat asal semua pernyataan SQL yang berjaya dilaksanakan apabila transaksi ditarik balik.
Apabila transaksi mengubah suai pangkalan data, InnoDB akan menjana log buat asal yang sepadan jika pelaksanaan transaksi gagal atau pemulangan dipanggil, menyebabkan urus niaga ditarik balik, maklumat dalam log buat asal boleh digunakan untuk melancarkan semula data ke; cara sebelum pengubahsuaian. Buat asal log ialah log logik, yang merekodkan maklumat yang berkaitan dengan pelaksanaan SQL. Apabila pemulangan berlaku, InnoDB akan melakukan perkara yang bertentangan dengan kerja sebelumnya berdasarkan kandungan log buat asal:
Innnodb mempunyai banyak log, dan kegigihan bergantung pada log semula.
Kegigihan pastinya berkaitan dengan penulisan Teknologi WAL yang sering disebut dalam MySQL, nama penuh WAL ialah Write-Ahead Logging cakera itu. Sama seperti berniaga di kedai kecil, ada papan merah jambu dan buku akaun Apabila tetamu datang, tulis di papan merah jambu dahulu, dan kemudian tulis buku akaun apabila anda tidak sibuk.
redo log ialah papan merah jambu ini Apabila rekod perlu dikemas kini, enjin InnoDB akan terlebih dahulu menulis rekod ke log buat semula (dan mengemas kini memori pada masa ini, kemas kini telah selesai). Pada masa yang sesuai, rekod operasi ini dikemas kini ke cakera, dan kemas kini ini sering dilakukan apabila sistem agak melahu, sama seperti yang dilakukan oleh pekedai selepas ditutup.
buat semula log mempunyai dua ciri:
for log redo, terdapat dua fasa: komit dan menyediakan. mungkin berbeza daripada menggunakannya. Status perpustakaan yang dipulihkan daripada log adalah tidak konsisten Okay, mari kita pergi ke sini dahulu dan lihat yang lain.
InnoDB juga menyediakan cache The Buffer Pool mengandungi pemetaan beberapa halaman data dalam cakera, yang berfungsi sebagai penampan untuk mengakses pangkalan data:
.Penggunaan Buffer Pool sangat meningkatkan kecekapan membaca dan menulis data, tetapi ia juga membawa masalah baharu: jika MySQL rosak dan data yang diubah suai dalam Buffer Pool tidak dibuang ke cakera, ia akan menyebabkan data rasuah. Hilang, ketahanan transaksi tidak terjamin.
Jadi saya menyertai log buat semula. Apabila data diubah suai, selain mengubah suai data dalam Buffer Pool, operasi juga akan direkodkan dalam log buat semula
Apabila transaksi diserahkan, antara muka fsync akan dipanggil untuk mengepam log buat semula.
Jika MySQL rosak, anda boleh membaca data dalam log buat semula dan memulihkan pangkalan data apabila dimulakan semula.
log buat semula menggunakan WAL (Pengelogan tulis ke hadapan, log tulis ke hadapan terlebih dahulu ditulis pada log dan kemudian dikemas kini ke Kolam Penampan, memastikan data tidak akan hilang akibat masa henti MySQL, sekali gus memenuhi ketahanan). Memerlukan. Dan terdapat dua kelebihan untuk melakukan ini:
Bercakap tentang ini, anda mungkin tertanya-tanya bahawa terdapat juga log sampah yang juga digunakan untuk operasi menulis dan digunakan untuk pemulihan data.
untuk penyata update T set c=c+1 where ID=2;
Kenapa perlu tulis log buat semula dahulu?
Ketekalan ialah matlamat utama yang diusahakan oleh urus niaga. Sudah tentu, yang di atas adalah semua jaminan di peringkat pangkalan data, dan pelaksanaan ketekalan juga memerlukan jaminan di peringkat aplikasi.
Iaitu, untuk perniagaan anda, sebagai contoh, operasi pembelian hanya memotong baki pengguna dan tidak mengurangkan inventori Sudah pasti mustahil untuk memastikan status itu konsisten.
Kita semua biasa dengan MySQL, dan kita juga tahu apa itu ACID, tetapi bagaimana ACID MySQL dilaksanakan?
Kadang-kadang, seperti yang anda tahu bahawa terdapat batal log dan buat semula log, tetapi anda mungkin tidak tahu mengapa ada apabila anda mengetahui tujuan reka bentuk, ia akan menjadi lebih jelas.
Atas ialah kandungan terperinci Penemubual: Bagaimanakah MySQL melaksanakan ACID?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!