事务隔离 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:
参考文档:
浙公网安备 33010602011771号