Rumah  >  Artikel  >  pangkalan data  >  Mekanisme pengasingan transaksi terperinci MySQL dan prinsip pelaksanaan

Mekanisme pengasingan transaksi terperinci MySQL dan prinsip pelaksanaan

WBOY
WBOYke hadapan
2022-11-14 16:29:332033semak imbas

Artikel ini membawa anda pengetahuan yang relevan tentang mysql Ia terutamanya memperkenalkan penggunaan urus niaga MySQL dan risiko urus niaga yang lama, urus niaga MySQL dan ciri-cirinya, dan akibat daripada urus niaga serentak, pengasingan transaksi tahap dan demonstrasi, kunci kawalan versi tunggal dan kawalan serentak berbilang versi MVCC, dsb. Mari kita lihat bersama-sama saya harap ia akan membantu semua orang.

Mekanisme pengasingan transaksi terperinci MySQL dan prinsip pelaksanaan

Pembelajaran yang disyorkan: tutorial video mysql

1 1. Apakah itu urus niaga?

Transaksi ialah satu siri operasi yang dilakukan sebagai satu unit kerja logik. Sama ada semua atau tiada operasi ini adalah unit kerja yang penting.

Sebagai contoh, dalam proses membayar sesuatu, akan ada beberapa siri operasi, seperti menyemak baki, menambah atau menolak, dan mengemas kini baki. Operasi ini mestilah serentak. Jika tidak, ia akan menunjukkan bahawa pembayaran anda telah berjaya, tetapi sistem tidak menerima wang

Dalam MySQL, sokongan transaksi dilaksanakan pada lapisan enjin, dan enjin MyISAM tidak menyokong transaksi

2. Empat Ciri Transaksi

Untuk menjadi transaksi, unit kerja logik mesti memenuhi empat ciri dalam sistem pengurusan pangkalan data hubungan.

Apa yang dipanggil ACID: atomicity, konsistensi, pengasingan dan ketahanan.

Atomicity

: Semua operasi transaksi sama ada selesai atau tidak lengkap dan tidak akan berakhir di peringkat pertengahan.

Ketekalan

: Had integriti pangkalan data tidak akan dipecahkan sebelum dan selepas transaksi.

Pengasingan

: Perhubungan dipaparkan apabila berbilang transaksi mengakses data yang sama dalam pangkalan data pada masa yang sama.

Kegigihan

: Selepas transaksi selesai, perubahan yang dibuat oleh transaksi akan berterusan dan tidak akan hilang.

ACID perlu dijamin melalui Redo dan Undo log. Penjelasan terperinci sistem log MySQL: (akan ditambahkan kemudian)

3. Penggunaan transaksi MySQL

MySQL mempunyai dua kaedah permulaan transaksi berikut:

3.1. Mulakan penyata transaksi dengan jelas

mulakan atau mulakan transaksi. Pernyataan komit yang sepadan adalah komit dan penyataan pemulangan semula adalah pemulangan semula.

3.2. Matikan penyerahan automatik
BEGIN -- 开启事务
START TRANSACTION -- 开启事务

INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' );

COMMIT -- 提交事务

ROLLBACK -- 回滚事务

set autocommit=0, arahan ini akan mematikan penyerahan automatik urutan ini. Ini bermakna jika anda hanya melaksanakan penyata pilihan, transaksi akan dimulakan dan tidak akan dilakukan secara automatik. Urus niaga ini berterusan sehingga anda secara aktif melaksanakan penyataan komit atau rollback, atau sehingga anda memutuskan sambungan. (Tidak disyorkan!)

2. Mekanisme pengasingan dan pengasingan transaksi MySQL
set autocommit=0 -- 关闭自动提交

INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' );

COMMIT -- 提交事务

ROLLBACK -- 回滚事务

Apabila berbilang transaksi dilaksanakan secara serentak pada pangkalan data (boleh difahami sebagai berbilang tugas , senario serentak), bacaan kotor, bacaan tidak berulang dan bacaan hantu mungkin berlaku.

1. Empat tahap pengasingan

Untuk menyelesaikan masalah ini, MySQL memperkenalkan konsep "tahap pengasingan".

Semakin tinggi tahap pengasingan, semakin rendah kecekapan Berkali-kali, kita mesti mencari keseimbangan antara keduanya. Tahap pengasingan urus niaga standard SQL termasuk: baca (baca) tidak komited (baca tidak komited), baca (baca) komited (baca komited), baca berulang (boleh dibaca berulang) dan boleh bersiri (boleh bersiri).

Read Uncommitted

(

RU, Read Uncommitted), yang boleh membaca proses perantaraan transaksi. Ia melanggar sifat ACID dan mempunyai isu bacaan kotor. Oleh itu ia pada asasnya tidak digunakan dan boleh diabaikan. Read Committed

(

RC, Read Committed), yang bermaksud bahawa jika transaksi lain telah dilakukan, kita dapat melihat bahawa ini juga merupakan tahap yang paling biasa digunakan. Walau bagaimanapun, disebabkan beberapa sebab sejarah, RC mungkin tidak banyak digunakan dalam persekitaran pengeluaran. Bacaan Berulang

(

RR, Bacaan Boleh Ulang) pada masa ini ialah tahap yang paling banyak digunakan. Ia menampilkan penguncian jurang, yang masih tahap lalai. Pada tahap ini, kebuntuan, konkurensi rendah dan masalah lain sering berlaku. Serialization

(boleh bersiri) bukan pelaksanaan berbilang versi, tetapi pelaksanaan versi tunggal, kerana semua pelaksanaannya dilaksanakan melalui kunci. Pada asasnya tidak digunakan dan boleh diabaikan.

2. Masalah yang disebabkan oleh urus niaga serentak

Bacaan kotor

: Transaksi A membaca data yang dikemas kini oleh transaksi B, dan kemudian B melancarkan semula, jadi Data yang dibaca oleh A adalah kotor (data yang tidak sepatutnya wujud)

Bacaan tidak boleh berulang

: Transaksi A membaca data yang sama beberapa kali. Urus niaga B mengemas kini dan melakukan data semasa berbilang pembacaan transaksi A, menyebabkan keputusan tidak konsisten apabila transaksi A menangkap data yang sama berbilang kali.

Transaksi membaca data yang telah diserahkan oleh transaksi lain, menyebabkan data berbeza dibaca dua kali

幻读:A查出来数据,此时B提交,A再次查同一数据时结果不一致。一个事务前后两次读取的数据不一致,是因为其他事务插入数据导致的事务并发情况

不可重复读和幻读很容易混淆,不可重复读侧重于修改,而幻读侧重于添加或删除。要解决不可重复读取的问题,只需要符合条件的行,而要解决幻读问题需要锁表

3、隔离级别问题剖析与演示

3.1 查看mysql事务隔离级别

SELECT @@transaction_isolation; -- 查看mysql事务隔离级别
SELECT @@tx_isolation;          -- 查看mysql事务隔离级别

3.2、脏读问题

将事务隔离级别修改为读未提交,可以看到,事务还没有提交,这时候去查询这条数据,发现数据已经可见了。

set session transaction isolation level read uncommitted; -- 设置成读未提交
SELECT @@tx_isolation;          -- 查看mysql事务隔离级别

START TRANSACTION -- 事务A
INSERT INTO fork_business_detail VALUES ( 4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1' );
ROLLBACK

select * from fork_business_detail where id= 4 -- 事务B

3.3、不可重复读

一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况。

select * from fork_business_detail where id= 4;

BEGIN; -- 开启事务
select * from fork_business_detail where id= 4;
UPDATE fork_business_detail set SUB_ODR_ID=123004 where id= 4;
COMMIT;

select * from fork_business_detail where id= 5;

三、MySQL事务实现原理

1、单版本控制——锁

serializable ,使用锁独占方式来确保只有一个版本时事务被隔离,因此锁可以理解为单版本控制。

在MySQL事务中,锁的实现与隔离级别有关。在RR(Repeatable Read)隔离级别下,MySQL使用间隙锁来防止以并行性为代价写入数据,以解决虚拟读取的问题。

这种类型的锁通常会导致死锁,因为它没有足够的并行性和许多冲突。现在流行的Row模式可以避免许多冲突甚至死锁,因此建议默认使用Row+RC(Read Committed)模式隔离级别,这可以大大提高数据库的读写并行性。

2、多版本控制MVCC

多版本控制,也称为MVCC,是指数据的多版本处理,以实现数据库中的高度并发数据访问,以及事务的可见性,以确保事务可以看到其应该看到的数据版本。

如何生成多个版本?

每次修改数据库时,撤消( Undo log)日志都会记录当前修改记录的事务号和修改前数据状态的存储地址(即ROLL_PTR),以便在必要时回滚旧数据版本。

例如,读取事务查询当前记录,但最近的事务尚未提交。根据原子性,读取事务无法看到最新的数据,但您可以在回滚段中找到旧版本数据,从而生成多个版本。

多版本控制巧妙地将独占和独占的稀有资源转换为并发,大大提高了数据库吞吐量和读/写性能。

推荐学习:mysql视频教程

Atas ialah kandungan terperinci Mekanisme pengasingan transaksi terperinci MySQL dan prinsip pelaksanaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.im. Jika ada pelanggaran, sila hubungi admin@php.cn Padam