MySQL事务隔离

  • 介绍
    mysql默认是使用innodb引擎,大多数时候也是用innodb。
    innodb引擎是基于事务的引擎。所有操作都是基于事务,除了用户主动开启的显式事务,未主动开启事务的操作,innodb也会隐式开启事务进行操作。
    mysql有四种事务隔离级别:
        - 读未提交
        - 读已提交
        - 可重复读
        - 串行化
  • 前置概念
    MVCC: 多版本管理机制,用于读时生成快照。快照只保证同一行版本不变。
    脏读:指读到其他事务未提交的数据,可能是无效的数据。
    不可重复读:指事务内两次或多次行读取结果不同。
    幻读:指事务内两次或多次范围查询数据行数不一致。
    间隙锁:指锁住行之间间隙的锁。锁住期间,这些行内不能插入新行。
  • 读未提交
    基本介绍:可以读到其他事务尚未提交的数据,不使用MVCC,写时会加行锁。
    优点:
        -并发读取比较快
    缺点:
        - 可能脏读
        - 可能不可重复读
        - 可能幻读
  • 读已提交
    基本介绍:只能读到已提交的数据,使用MVCC,并且每次读都会生成快照,写时会加行锁。
    优点:
        - 不会产生脏读
    缺点:
        - 可能不可重复读
        - 可能幻读
  • 可重复读
    基本介绍:只能读到已提交的数据,使用MVCC,并且事务内读只会生成一次快照。写时会加行锁。通过索引范围查询时,会加间隙锁,不通过索引范围查询时,会加表锁。
    优点:
        - 不会产生脏读
        - 事务内多次读取结果一致
        - 不容易发生幻读
    缺点:
        - 有间隙锁更容易产生死锁。
        - 不通过索引范围查询会触发表锁,性能骤降。
  • 串行化
    基本介绍:读加共享锁,写加排他锁,范围查询加间隙锁或表锁,不使用MVCC。所有事务看起来是串行执行的。
    优点:
        - 不会产生脏读,幻读,不可重复读的问题,并发下安全性高。
    缺点:
        - 并发性能最弱
  • 补充
    mysql默认采用可重复读的事务隔离级别,可以通过改变连接参数指定会话中操作的事务隔离级别。
posted @ 2025-08-26 21:48  CJTARRR  阅读(8)  评论(0)    收藏  举报