美文网首页
Mysql事务

Mysql事务

作者: 奔跑地蜗牛 | 来源:发表于2018-12-01 21:58 被阅读0次

事务隔离级别

事务隔离级别有四种:read-uncomitted,read-commited,repeatable-read,serializable;

read-uncomitted:未提交读,即可以读取另一个事务已经更新但尚未提交的数据,会出现幻读,脏读,不可重复读等各种状况;

read-commited:提交读,指只能读取另一个事务已经更新且已经提交的数据,可以避免脏读,但是可能会出现不可重复读等情况;

repeatable-read:可重复读,即可以重复读取数据,开启事务后,同一查询条件不会产生不一样的结果,不会出现不可重复读,脏读等情况,但是可能出现幻读,mysql默认为可重复读;

serializable:串行读,即读写都是串行的,读写都会加上表级锁,不会出现脏读,幻读,不可重复读;

>幻读:指的是读取的数据是不正确的数据,事务1读取数据行1的到字段a值为aa,但是可能存在另一个事务对该数据行进行更新操作,修改该值为bb,那么事务1读取到的数据就是不正确的,这就是幻读;

脏读: 指的是读取到别人未提交的数据

示例

     
   查询开始前,设置事务隔离级别为read-uncommitted,set @@session.tx_isolation='read-uncommitted';

  如下所示:

开启事务,更新数据,未提交

图1,事务更新数据

开启另一个connection,设置隔离级别为read-uncommited,可以读取到未提交的数据,出现脏读

图二,未提交读

开启另一个connection,设置隔离级别为read-committed,只能读取提交数据,不会出现脏读,但是不能避免不可重复读,因为如果多个connection都修改了数据,每次读取数据都会不一样

图三 读未提交

读提交数据

图4,提交数据 图五 读提交

可重复读

开启一个connection,设置隔离级别为repeatable-read,查询前,开启事务,那么在事务提交之前,无论其他事务修改了多少次数据读取都是一样的

图六 第一次读
图七 更新一次
图8 未提交第二次读
图9 ,提交第二次读

从上可以看出,可重复读,再开启事务后,查询数据永远是开启事务前的数据,避免了脏读,和不可重复读

但是无法避免幻读

幻读是指一个事务读取到了不正确的数据,进行修改时发现数据已经不是原来的数据,从而导致失败,多发生于另一个事务修改了该数据;

可以使用串行来解决

serializable

  一个connection设置隔离级别为serializable,同时查询该数据,另一个connection修改该行数据

图十 串行读
图十一  修改数据

相关文章

网友评论

      本文标题:Mysql事务

      本文链接:https://www.haomeiwen.com/subject/dqumeftx.html