MVCC, nama penuhnya ialah Kawalan Pertukaran Berbilang Versi, iaitu kawalan penukaran berbilang versi. MVCC ialah kaedah kawalan berbilang konkurensi Ia biasanya digunakan dalam sistem pengurusan pangkalan data untuk mencapai akses serentak kepada pangkalan data dan untuk melaksanakan memori transaksi dalam bahasa pengaturcaraan.
Kami tahu bahawa MySql bertukar daripada enjin storan MyISAM kepada enjin storan InnoDB selepas 5.5, terutamanya kerana InnoDB menyokong urus niaga, jadi apabila berbilang urutan dilaksanakan pada masa yang sama, masalah serentak mungkin berlaku. Pada masa ini, kaedah yang boleh mengawal konkurensi mungkin muncul dan MVCC memainkan peranan ini.
MVCC dilaksanakan terutamanya oleh rangkaian versi log asal dan ReadView.
Buat asal log digunakan terutamanya untuk memulihkan data asal apabila transaksi ditarik balik.
Apabila mysql melaksanakan sql, ia akan menyimpan log logik yang bertentangan dengan hari itu ke log buat asal. Oleh itu, apa yang direkodkan dalam log batal juga adalah log logik.
Tetapi apabila mysql melaksanakan pernyataan Sisipkan, id kunci utama yang dimasukkan kali ini akan direkodkan dalam log buat asal. Apabila transaksi ditarik balik, padam memadamkan id ini.
Apabila melaksanakan pernyataan kemas kini, MySQL akan menyimpan data sebelum pengubahsuaian dalam log buat asal. Apabila transaksi ditarik balik, kemas kini dilakukan sekali lagi untuk mendapatkan data asal.
Apabila MySQL melaksanakan pernyataan padam, data sebelum pemadaman akan disimpan dalam log buat asal. Apabila transaksi ditarik balik, laksanakan sisip sekali lagi dan masukkan data asal.
Empat ciri utama dalam pangkalan data - atomicity, iaitu, urus niaga tidak boleh dibahagikan, sama ada semua berjaya atau semua gagal, dan lapisan bawah dicapai dengan log asal. Apabila pelaksanaan penyata tertentu gagal, penyata transaksi sebelumnya akan ditarik balik.
Dalam setiap baris pangkalan data, selain menyimpan data sebenar, terdapat juga 3 tersembunyi lajur Lajur: row_id, trx_id dan roll_pointer
row_id, nombor baris:
Jika jadual semasa mempunyai kunci utama integer taip, kemudian row_id Nilai ialah nilai kunci utama
Jika tiada kunci utama jenis integer, MySQL akan memilih indeks unik jenis integer bukan kosong sebagai row_id dalam susunan medan
Jika tiada ditemui, nombor yang berkembang secara automatik akan dibuat Integer sebagai row_id
trx_id, nombor transaksi:
Apabila transaksi mula dilaksanakan, MySQL akan Transaksi diberikan ID transaksi yang meningkat secara global.
Apabila transaksi menambah, mengubah suai, memadam, dsb. pada operasi semasa, ia akan merekodkan ID transaksinya sendiri ke dalam trx_id.
roll_pointer, rollback pointer:
Apabila transaksi menukar data semasa, data lama akan direkodkan dalam Dalam log buat asal, data ditulis pada baris semasa dan roll_pointer semasa menghala ke log buat asal tadi, jadi roll_pointer boleh digunakan untuk mencari versi baris sebelumnya.
Apabila terdapat urus niaga yang menukar baris, buat asal log akan dijana secara berterusan dan rantaian versi log buat asal akhirnya akan terbentuk.
Pada mulanya, kami menggunakan pernyataan berikut untuk mencipta jadual pelajar
CREATE TABLE `student` ( `id` INT ( 11 ) NOT NULL AUTO_INCREMENT, `name` VARCHAR ( 255 ) NOT NULL, `age` INT ( 11 ) NOT NULL, PRIMARY KEY ( `id` ) USING BTREE ) ENGINE = INNODB;
Sekarang buka transaksi pertama, transaksi id ialah 1 , laksanakan pernyataan sisipan berikut.
INSERT INTO student VALUES ( 1, "a", 24 );
Kemudian rajah semasa adalah seperti berikut:
Oleh kerana data baru dimasukkan, log buat asal yang ditunjukkan oleh penunjuk_gulungannya kosong.
Kemudian buka transaksi kedua, ID transaksi yang ditetapkan ialah 2, dan laksanakan arahan pengubahsuaian berikut.
UPDATE student SET NAME = 'b' WHERE id = 1;
Rajah semasa bertukar kepada:
Apabila transaksi ketiga dibuka dan id transaksi yang diberikan ialah 3, laksanakan arahan pengubahsuaian berikut.
UPDATE student SET age = 25 WHERE id = 1;
Rajah menjadi:
Apabila setiap transaksi menukar baris, log buat asal akan dihasilkan untuk menyimpan versi sebelumnya daripada roll_pointer ke log batal yang baru dijana.
Oleh itu, roll_pointer boleh menyambungkan versi berbeza siri buat asal log ini untuk membentuk rantaian versi log asal.
Pertama sekali, anda perlu memahami bacaan syot kilat dan bacaan semasa
Bacaan syot kilat: pertanyaan pilih mudah, iaitu, ia tidak termasuk kunci … dalam mod kongsi, pilih &hellip untuk kemas kini, anda boleh membaca versi sejarah data.
Bacaan semasa: Penyataan berikut adalah semua bacaan semasa Versi terkini sentiasa dibaca dan versi terkini dibaca dikunci.
select ... lock in share mode select ... for update insert update delete
Apabila transaksi melakukan setiap bacaan syot kilat atau apabila transaksi melakukan bacaan syot kilat buat kali pertama, paparan yang konsisten, iaitu ReadView, akan dijana.
Fungsi ReadView adalah untuk menentukan data dalam rantaian versi log asal boleh dilihat kepada transaksi semasa.
m_ids
Pada masa ReadView dicipta, A koleksi semua ID transaksi tidak komited dalam mysql.
min_trx_id
m_ids中的最小值
max_trx_id
mysql即将为下一个事务分配的事务id,并不是m_ids中的最大值。
creator_trx_id
即创建此ReadView的事务id
简要的示意图如下:
那么事务在执行快照读时,可以通过以下的规则来确定undo log版本链上的哪个版本数据可见。
如果当前undo log的版本的trx_id
如果当前undo log的版本的trx_id≥max_trx_id,说明该版本对应的事务在生成ReadView之后才开始的,因此是不可见的。
如果当前undo log的版本的trx_id∈[min_trx_id,max_trx_id),如果在这个范围里,还要判断trx_id是否在m_ids中:
在m_ids中,说明版本对应的事务未提交,因此是不可见的。 不在m_ids中,说明版本对应的事务已经提交,因此是可见的。
如果当前undo log的版本的trx_id=creator_trxt_id,说明事务正在访问自己修改的数据,因此是可见的。
当undo log版本链表的头结点数据被判定为不可见时,则利用roll_pointer找到上一个版本,再进行判断。如果整个链表中都没有找到可见的数据,则代表当前的查询找不到数据。
Atas ialah kandungan terperinci Apakah mekanisme MVCC dalam MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!