Artikel ini akan membawa anda memahami syot kilat dalam MVCC dan melihat cara syot kilat berfungsi dalam MVCC? Semoga ia dapat membantu semua orang!
Dalam MySQL (enjin storan innodb), sebenarnya, setiap rekod akan merekodkan operasi rollback pada masa yang sama apabila ia dikemas kini. Nilai terkini pada rekod boleh diperoleh dengan menggulung semula nilai keadaan sebelumnya.
Andaikan nilai ditukar daripada 1 kepada 2, 3 dan 4 dalam urutan, akan terdapat rekod yang serupa dengan yang berikut dalam log putar balik.
Nilai semasa ialah 4, tetapi apabila menanyakan rekod ini, urus niaga bermula pada masa yang berbeza akan mempunyai paparan baca yang berbeza. Seperti yang anda lihat dalam rajah, dalam paparan A, B, dan C, nilai rekod ini masing-masing adalah 1, 2, dan 4 Rekod yang sama boleh wujud dalam berbilang versi dalam sistem, iaitu berbilang-. kawalan konkurensi versi (MVCC) pangkalan data ). Untuk paparan baca A, untuk mendapatkan 1, nilai semasa mesti diperolehi dengan melaksanakan semua operasi rollback dalam rajah.
Setiap transaksi dalam InnoDB mempunyai ID transaksi unik, dipanggil id transaksi. Ia digunakan pada sistem urus niaga InnoDB pada permulaan urus niaga, dan meningkat secara ketat mengikut susunan permohonan.
Dan setiap baris data juga mempunyai berbilang versi. Setiap kali transaksi mengemas kini data, versi data baharu akan dijana dan id transaksi akan diberikan kepada ID transaksi versi data ini, direkodkan sebagai trx_id baris. Pada masa yang sama, versi data lama perlu dikekalkan, dan dalam versi data baharu, perlu ada maklumat yang boleh diperoleh secara langsung.
Dalam erti kata lain, satu baris rekod dalam jadual data sebenarnya mungkin mempunyai berbilang versi (baris) dan setiap versi mempunyai trx_id barisnya sendiri.
Mengikut takrifan boleh dibaca berulang, Apabila transaksi bermula, anda boleh melihat hasil semua transaksi yang dilakukan. Tetapi kemudian, semasa urus niaga ini dilaksanakan, kemas kini daripada urus niaga lain tidak dapat dilihat olehnya.
Oleh itu, transaksi hanya perlu mengisytiharkan apabila bermula, "Berdasarkan saat saya mula, jika versi data dijana sebelum saya mula, ia akan dikenali; jika saya mula Jika ia dijana nanti, saya tidak akan mengenalinya. Saya perlu mencari versi sebelumnya." Sudah tentu, jika "versi sebelumnya" tidak kelihatan sama ada, anda perlu terus melihat ke hadapan. Selain itu, jika data dikemas kini oleh transaksi itu sendiri, ia masih perlu mengenalinya.
Dari segi pelaksanaan, InnoDB membina tatasusunan untuk setiap transaksi untuk menyimpan semua ID transaksi yang sedang "aktif" pada masa transaksi dimulakan. "Aktif" bermaksud bahawa ia telah dimulakan tetapi masih belum diserahkan.
Nilai minimum ID transaksi dalam tatasusunan direkodkan sebagai paras air rendah, dan nilai maksimum ID transaksi yang telah dibuat dalam sistem semasa ditambah 1 direkodkan sebagai paras air yang tinggi.
Tatasusunan paparan ini membahagikan semua baris trx_id kepada beberapa situasi berbeza.
Dengan cara ini, untuk saat permulaan transaksi semasa, versi data baris trx_id mempunyai kemungkinan berikut:
Jika ia jatuh di bahagian hijau, ini bermakna versi ini adalah transaksi yang komited atau dijana oleh transaksi semasa itu sendiri, dan data ini boleh dilihat; bahagian, ini bermakna versi ini Ia dijana oleh transaksi yang dimulakan pada masa hadapan dan pastinya tidak kelihatan
Jika ia jatuh di bahagian kuning, ia termasuk dua situasi
Kemudian ID transaksi A ialah 100Contohnya:
sesi A memulakan transaksi A. Sebelum transaksi A bermula, terdapat tiga transaksi aktif dalam sistem, dengan ID 90 93 95.
Pada masa ini, tatasusunan pandangan untuk transaksi A adalah seperti ini [90 93 95 100], di mana paras air rendah ialah 90 dan paras air tinggi ialah 100 1= 101;
Kini transaksi A mula membaca data
- Jika anda membaca bahawa ID ialah 104, iaitu lebih besar daripada tanda air tinggi 101, ini bermakna versi ini dijana oleh transaksi yang dimulakan pada masa hadapan dan pastinya tidak kelihatan
- Anda membaca bahawa ID ialah 88, iaitu kurang daripada paras air rendah 90, bermakna versi ini adalah transaksi yang diserahkan atau dijana oleh transaksi semasa itu sendiri
- baca bahawa ID ialah 94, iaitu antara paras air rendah dan masa paras air tinggi, tetapi tidak berada dalam tatasusunan [90 93 95 100], ini bermakna versi ini dijana oleh transaksi yang telah diserahkan dan. kelihatan.
- Saya membaca bahawa ID ialah 93, iaitu antara paras air rendah dan paras air tinggi Tatasusunan [90 93 95 100] menunjukkan bahawa versi ini dijana oleh transaksi yang belum dilakukan. dan tidak kelihatan;
Peraturan penghakiman ini diterjemahkan secara langsung daripada logik kod, tetapi seperti yang anda lihat, ia menyusahkan untuk digunakan untuk keterlihatan analisis daging manusia.
Jadi, izinkan saya menterjemahkannya untuk anda. Untuk versi data, untuk paparan transaksi, selain kemas kininya sendiri sentiasa kelihatan, terdapat tiga situasi:
versi tidak komited dan tidak kelihatan; 🎜>
Versi telah diserahkan, tetapi ia telah diserahkan selepas paparan dibuat, jadi ia tidak kelihatanAtas ialah kandungan terperinci Analisis ringkas syot kilat dalam MVCC dan lihat cara syot kilat berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!