美文网首页
事务的四个隔离等级

事务的四个隔离等级

作者: zydmayday | 来源:发表于2020-04-11 13:07 被阅读0次

    1 read uncommitted

    设置隔离等级为未提交读

    mysql> set session transaction isolation level read uncommitted;
    

    当线程A开启事务A后更新表中的数据,在未提交的情况下,
    线程B开启的事务B可以访问到事务A的未提交结果,
    则称之为未提交读隔离等级。

    2 read committed

    设置隔离等级为提交读

    mysql> set session transaction isolation level read committed;
    

    当线程A开启事务A后更新表,在未提交的情况下,
    线程B开启的事务B是无法访问到事务A中的更新的。
    在事务A执行commit之后,事务B即可访问到事务A中的更新。

    3 repeatable read

    设置隔离等级为可重复读

    mysql> set session transaction isolation level repeatable read;
    

    当线程A开启事务A后,保持事务A的连接。
    此时线程B开启事务B并且插入了新数据并提交。
    事务A此时执行select语句是无法访问到事务B所提交的数据的,
    同时如果事务A此时insert了和事务B相同的数据,数据库会报错提示主键冲突。

    就好像事务A产生了幻觉一样。这种场景我们称之为幻读

    可重复读正如字面意思所示,事务A在执行多次select操作的时候,
    不会受到其他事务的影响可以重复获取相同的数据。

    4 serializable

    设置隔离等级为可串行化

    mysql> set session transaction isolation level serializable;
    

    这是隔离中的最高等级,也是一把双刃剑。可以防止上述的幻读,方法就是给行加锁。

    简单来说,
    线程A开启事务A后在未进行操作的情况下,
    线程B开启了事务B并且执行insert操作给表(user)增加了一行数据,
    事务A在select表(user)的时候操作会被挂起,
    直到事务B提交之后,事务A的select操作才会被执行。

    也就是说事务B在执行insert操作后给表的新增行上了锁,
    事务A在访问相同表的时候由于事务B仍然持有锁,
    事务A必须等待事务B释放锁后(rollback或者commit)才可以操作该表。

    由于锁的粒度是行等级的,这也就意味着如果事务B对表(user)的第10行进行了更新操作,在未提交的情况下,
    事务A是可以访问到表(user)除了第10行以外的数据的。
    如果select语句中包含了对第10行的访问或者操作,则将会被挂起。

    总结

    MySQL默认是可重复读隔离等级。

    相关文章

      网友评论

          本文标题:事务的四个隔离等级

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