• MySQL 并发事务问题和隔离级别 (事务篇 三)


    并发事务问题和解决

    1. 脏读(Dirty Read):

    脏读是指一个事务读取了另一个事务未提交的数据

    当一个事务修改了数据但尚未提交时,另一个事务读取到了这个未提交的数据,如果第一个事务最终回滚了,那么第二个事务读取到的数据就是无效的。

    MySQL通过使用锁机制来解决脏读问题,当一个事务对数据进行修改时,会对相关数据加锁(排它锁 -- X锁),其他事务在读取该数据时需要等待锁释放。

    2. 不可重复读(Non-repeatable Read):

    不可重复读是指在同一个事务中,多次读取同一数据,但得到的结果不一致

    这是因为在事务执行期间,其他事务可能对数据进行了修改或删除。

    MySQL使用MVCC(版本控制)来解决不可重复读问题。MVCC为每个事务创建一个独立的数据版本,事务在读取数据时会根据自己的版本号获取数据。当一个事务执行读操作时,如果其他事务对数据进行了修改或删除,MySQL会根据事务的版本号和时间戳来判断数据的可见性(事务开始时的数据快照),确保读取到的数据是一致的,避免了不可重复读问题。

    3. 幻读(Phantom Read):

    幻读是指在同一个事务中,多次执行相同的查询(一般是范围查询),但返回的结果集不一致。或者一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。

    这是因为在事务执行期间,其他事务可能插入或删除了符合查询条件的数据。

    MySQL通过使用间隙锁(Gap Lock)来解决幻读问题。间隙锁锁定了一个范围而不是具体的数据行,阻止其他事务在该范围内插入新数据。

    事务隔离级别

    查询和修改隔离级别

    1. -- 查看
    2. select @@transaction_isolation;
    3. -- 修改(建议选用会话(当前连接有效)session)
    4. set [ session | global ] transaction isolation
    5. level { read uncommitted | read committed | repeatable read | serializable }

    四个隔离级别

    隔离级别可能出现的问题
    Read uncommitted             -- 读未提交脏读、不可重复读、幻读
    Read committed                 -- 读已提交不可重复读、幻读
    Repeatable Read(默认)     -- 可重复读幻读
    Serializable                        -- 串行化x

    事务隔离级别越高,数据越安全,但是性能越低

    上一篇MySQL 事务的操作指南(事务篇 二)

  • 相关阅读:
    面向对象技术--面向对象开发技术
    论文技巧2
    【LeetCode】【Java】有效的数组
    计算机基础(1)——Verilog语法入门
    微信公众号怎么从个人转为企业?
    手游玩家的新选择,一加Ace Pro“青“开箱
    文章列表的显示 以及创建文章 还有文章详情的基本
    springboot如何将http请求转换为https请求呢?
    DM8 数据库主备/读写分离集群增加节点
    Vue 项目中的自适应布局:px 转换成 vw/vh
  • 原文地址:https://blog.csdn.net/DU9999999/article/details/133325485