• 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 事务的操作指南(事务篇 二)

  • 相关阅读:
    JQ调接口,html页面
    使用matlab,求解该方程的数值解,并分别画出状态变量的时间响应图、相空间的三维图
    尚硅谷-Spring Cloud
    MySQL:完整性约束和 表的设计原则
    Aroid问题笔记 - ViewPager嵌套RecyclerView,降低ViewPager灵敏度
    Android WebRTC 入门教程(二) -- 模拟p2p本地视频传输
    【KBQA-2】 Learning To Retrieve Prompts for In-Context Learning
    如何检验下载的大模型checkpoint文件是否正确的解决方案
    JS-新增水果库存记录表单页面实现
    04|主观与客观评价音频质量
  • 原文地址:https://blog.csdn.net/DU9999999/article/details/133325485