事务隔离 MVCC next-key

事务的四个特性: ACID

原子性:

一致性:

隔离性:

持久性:

 

事务的一致性主要就是通过 原子性和隔离性来保证的。

事务的隔离级别:


未提交读:   能够读到另一个事务未提交的数据,会出现脏读

读已提交:   能够读到另一个事务提交的数据, 会出现不可重复读      (oracle的默认隔离级别)

可重复度:   会出现幻读。  (通过MVCC来实现的可重复读)             (mysql的默认隔离级别 )

串行化:  事务串行执行,效率低

 

事务的并发会产生的问题:  脏读、不可重复读、幻读

查询隔离级别:

select @@tx_isolation;

设置隔离级别:

设置这个会话的隔离级别

set session transaction isolation level read uncommitted; 

 

set global transaction isolation level read uncommitted; 

 

MVCC:  乐观锁的一种实现方式

每一行中有两个版本号, 行数据创建的版本号,行数据删除的版本号。 这里的版本号指的是当时进行相应操作的事务的版本号

执行select操作时,其实执行的是快照读, 也就是读取的 行数的创建的版本号要小于或者等于当前事务的版本号,也就是在这个事务执行之前数据就已经存在,对于大于当前事务版本号的数据,不进行返回。 比较删除版本号,删除版本号大于当前版本或者删除版本号为NULL, 通过比较创建版本号和和删除版本号来实现可重复读。

 

当执行insert 插入操作时,将创建版本号设置为当前事务的版本号。

当执行delete删除数据时,将删除版本号设置为当前事务的版本号。

当执行update更新操作时,复制一份原来的行数据,修改其中的数据,然后将新的行数据的 创建版本号,设置为当前事务的版本号,将原来的行数据的删除版本号设置为当前事务的版本号。

 

update 操作,执行的是当前读,会对数据库中的所有复合符合要求的数据进行操作。通过update操作,会新得到一行数据,新数据的创建版本号就是当前事务的版本号,那么如果A事务执行select查询操作,然后b事务插入了数据并提交完成,这是A事务执行update操作,就有可能复制了一份原本不会被A事务读到的数据,这时候,执行select操作,就会发生幻读。

 

NEXT-KEY:  解决幻读


为了解决幻读,即不让在select查询的范围内, 发生数据的插入即可。通过间隙锁和行锁来实现。

 

undolog: 

 

 

https://www.yuque.com/chenjiayang/blog/dozcqo#%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%B8%80%E8%87%B4%E6%80%A7%E8%AF%BB--readview

 

 

 

参考文档:

https://www.cnblogs.com/mysql-hang/articles/11027685.html

posted @ 2020-07-05 19:29  你眼里的星辰  阅读(162)  评论(0)    收藏  举报