MySQL隔离级别

284 阅读2分钟
  • 四种隔离级别

    • 读未提交(Read Uncommitted)
    • 读已提交(Read Committed)
    • 可重复读(Repeatable Read)
      • mysql 里的默认隔离级别
    • 串行化(Serializable)
  • 有什么问题

    • 脏写
      • 两个事务并发写同一行记录,所有隔离级别下都不能允许发生这种情况
      • 比如事务A和事务B对同一行进行写操作,在事务A更新数据且未提交时,事务B也更新了该行,就会造成脏写。
    • 脏读
      • 事务A读到事务B还未提交的写
    • 不可重复读
      • 事务中对同一行的多次读取的结果不同
      • 事务A读了某行数据,事务B对该行进行了更新并提交,事务A再次读取该行后的结果与第一次读取的结果不同
    • 幻读
      • 对某个范围的多次读取不同
      • 因为两次读中间,其他事务在该范围内插入了数据并提交
      • 比如事务A读取了id为0~10的数据,此时事务B插入了id=5的数据,事务A再次读取id为0~10的数据时会发现多了一行
  • 怎么解决

    • MVCC
      • 多版本并发控制,允许读写同时进行,性能较好
      • 事务利用MVCC进行的读称为一致性读或快照读
    • 加锁
      • 读写不能同时进行,性能较差
  • 四种隔离级别解决的问题

    • Read Uncommitted

      • 什么都没有解决,脏读、不可重复读、缓读都存在
    • Read Committed

      • 解决了脏读
      • 通过ReadView实现,每次读都开启一个ReadView
    • Repeatable Read

      • 通过ReadView实现,第一次读才开启一个ReadView
      • SQL标准中只要求RR解决脏读和不可重复读,InnoDB中同时解决了脏读、不可重复读和幻读
    • Serializable

      • 解决了脏读、不可重复读和幻读
      • 由于所有请求只能排队操作,性能最差,通产在线上不会使用这种隔离级别