美文网首页
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