大佬教程收集整理的这篇文章主要介绍了MySql MVCC是如何实现的-事务隔离级别?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
事务就是要保证一组数据库操作,要么全部成功,要么全部失败。 在MySql中,事务支持是在引擎层实现的,但是只有InnoDB支持事务,MyISAM是不支持的。 事务具有原子性,一致性,隔离性,持久性,这里我们要谈的就是隔离性。 MySql标准的事务隔离级别包括: 读未提交(read uncomminted):一个事务还没有提交时,它做的变更就能被被的事务看到。 读提交(read commited):一个事务提交后,它做的变更才会被其他事务看到。 可重复读(repeatable read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。 串行化(serializable):对于同一行记录,“写”会加“写锁”,“读”会加“读锁”,出现读写锁冲突的时候,后访问的食物必须等待前一个事务执行完成,才能继续执行。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |
1.查看MySql默认的隔离级别,可见MySql默认可重复读。从上图我们可以看到,不管是什么隔离级别,都会存在一些问题,并且隔离的越严实,执行效率就会越低。比如:串行化,所以很多时候我们只是在效率和隔离之间找一个平衡点。
@H_43_0@mySql5.7以前的版本:show variables like 'tx_isolation'; MySql5.7(包含)以后的版本:show variables like 'transaction_isolation';
@H_43_0@mysql> show variables like 'tx_isolation'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tx_isolation | REPEATABLE-READ | +---------------+-----------------+ 1 row in set (0.00 seC)
举例说明:
事务A | 事务B |
---|---|
1启动事务 | |
2.查询得到值V0 | 3启动事务 |
4.查询得到值V0 | |
5.将V0改为V0+1 | |
6.查询得到值V1 | |
7.提交事务B | |
8.查询得到值V2 | |
9.提交事务A | |
10.查询得到值V3 |
set session transaction isolation level read uncommitted;
注意步骤6直接读到了步骤5中修改的值,此时事务B实际还未提交,这就是读未提交(read uncommited),事务级别读未提交存在脏读的问题,比如此用例中如果事务B做了回滚,那么事务A在第4步骤查询得到的值就是不正确的,这就是所谓的脏读
set session transaction isolation level read committed;
注意步骤6没有读到步骤5中修改的值,步骤7,事务B提交之后,步骤8读到了步骤5修改的值,这就是读提交(read commited),事务级别读提交存在不可重复读的问题,比如此用例中,同一个事务,在不同的阶段读同一行数据读到了不同的值,这就是所谓的不可重复读,解决不可重复读的方法是加行锁,事务A在执行未提交的时候,事务B无法修改数据,即可避免
set session transaction isolation level repeatable read;
注意步骤6没有读到步骤5中更改的值,步骤7事务B提交之后,步骤8依然没有读到步骤5中更改的值,直到事务A也提交之后才读到事务B更改的值,这就是可重复读(repeatable read)
事务A | 事务B |
---|---|
1启动事务 | |
2查询V0 | |
3插入 | |
4查询V1 | |
5提交事务 | |
6查询V2 | |
7更新 | |
8查询V3 |
set session transaction isolation level serializable;
事务A | 事务B |
---|---|
1启动事务 | |
2启动事务 | |
3插入数据 | |
4查询数据 | |
5提交事务 | |
6查询数据 |
按照上述表格的顺序,依次执行,步骤3插入数据,但是未提交的时候,步骤4出现了获取锁超时的情况,这就是串行化(serializable ),同一行数据不允许并发执行,在写时,读必须等待。
以上是大佬教程为你收集整理的MySql MVCC是如何实现的-事务隔离级别?全部内容,希望文章能够帮你解决MySql MVCC是如何实现的-事务隔离级别?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。