MySQL事务隔离级别

2020-09-01 09:59:16 289 0 MySQL

事务

MySQL 中为了保证一系列操作的数据一致性、原子性,提供了 事务 机制,事务是作为单个逻辑工作单元执行的一系列操作,单个事务内的所有操作要么全部执行(COMMIT),要么全部不执行(ROLLBACK)

并发事务带来的问题

由于 Mysql 对于不同客户端的查询采用的是多线程的工作方式,所以在多个并发事务对相同数据进行处理时,会由于并发事务带来一些问题。总结下来大概分为以下三种:

  • 脏读:多个事务并发处理相同数据,事务 A 读取到了事务 B 修改后未提交或已回滚的数据,导致事务 A 读到的数据成为脏数据,最终出现数据一致性问题
  • 不可重复读:事务 A 多次读取同一数据,事务 B 对该数据数据进行了修改并提交操作,导致事务 A 多次读取到的数据不一致,无法判断哪个数据才是最准确的
  • 幻读:事务 A 按照指定搜索条件查询数据,事务 B 新写入了相同搜索条件的数据,事务 A 再次使用相同条件查询数据,发现多了事务 B 新写入的数据

不可重复读和幻读的区别是:不可重复读指的是对已存在数据的多次查询结果会被其他事务的修改操作影响,而幻读主要指的是其他事务新增、删除数据对当前事务的影响。

事务隔离级别

为了解决上面提到的三种并发问题,MySQL 提供了四种事务隔离级别可供选择,不同的级别能够依次解决:脏读、不可重复读、幻读问题。

  • 未提交读:Mysql 最低的隔离级别,该级别允许事务 A 读取到其他事务中未提交的数据,由于该级别会导致脏读问题且相较其他级别性能也没有很大的差距,在企业应用中很少使用该隔离级别
  • 提交读:该级别能够保证事务 A 只能读取到其他事务中已提交的数据,解决了脏读的问题
  • 可重复读:该级别能够保证在事务 A 中多次读取同一数据的结果保持一致,不会因为其他事务修改并提交了该数据而导致多次读取结果不一致,解决了不可重复读问题。同时该级别是 MySQL 默认事务隔离级别
  • 串行化:该级别是隔离程度最高的级别,所有事务在该级别下将会是顺序执行,会导致大量的阻塞和锁竞争。所以性能比较捉急,一般场景不会使用该级别

评论

:doodle { @grid: 32 / 100vmax; } @random { border-top: 1px solid #60569e; } @random { border-left: 1px solid #60569e; } @random(.2) { :after { content: ''; background: hsl(@rand(360), 60%, 70%); @size: @rand(3px); } }