一文读懂MySQL中的事务隔离级别

2020年8月2日14:00:10 评论 13

事务的特性(ACID)

原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作但愿,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作

一致性(Consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。

隔离性(Isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。

持久性(Durability):一旦事务提交,事务对数据库的所有更新将被保存到数据库,不能回滚。

事务并发存在的问题

脏读:事务读取了未提交的数据。如:事务A读取了事务B更新的数据,然后事务B回滚了,那么A读取到的数据是脏数据。

不可重复读:在同一个事务中两次执行同样的查询,得到的结果不一致。如:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

幻读:当某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。InnoDB可以通过多版本并发控制(MVCC)解决幻读的问题。

事务隔离级别

READ UNCOMMITTED(未提交读):一个事务中的修改操作即使没有提交,对其他事务也都是可见的。会出现脏读的问题

READ COMMITTED(提交读):一个事务开始时,只能“看见”已经提交的事务所做的修改。解决了脏读的问题,但是会存在不可重复读的问题

REPEATABLE READ(可重复读):一个事务在多次读取同样记录时,结果是一致的。解决了脏读和不可重复读的问题,但是无法解决幻读的问题

SERIALIZABLE(可串行化):在读取的每一行数据上都加锁,通过强制事务串行执行的方式,避免了脏读、不可重复读和幻读的问题,但是性能差

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
读未提交(read-uncommitted) Yes Yes Yes No
不可重复读(read-committed) No Yes Yes No
可重复读(repeatable-read) No No Yes No
可串行化(serializable) No No No Yes

总结

事务的隔离级别从高到低的排序为:可串行化 > 可重复读 > 不可重复读 > 读未提交

不可重复读针对的是记录的修改操作,幻读针对的是记录的插入操作

MySQL默认的事务隔离级别是REPEATABLE-READ,可以通过show variables like 'transaction_isolation';命令查看

 

  • 客服微信
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • OPS技术联盟,每天掌握一个小知识!
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: