MySQL

MySQL Innodb 事务隔离级别

2018-12-04  本文已影响4人  RoyTien

Reference

事务并发的可能问题与其解决方案
脏读、幻读、不可重复读和丢失更新
数据库并发事务存在的问题(脏读、不可重复读、幻读等)
对于脏读,不可重复读,幻读的一点理解,看懂红字很关键
MySQL 四种事务隔离级的说明
15.7.2.1 Transaction Isolation Levels
MySQL Innodb 事务隔离级别
【漫画】如何给新来的师妹解释什么是数据库的脏读、不可重复读和幻读
Understanding MySQL Isolation Levels: Repeatable-Read


SQL 多个事务并发时可能遇到的问题

Ioslation 事务四个隔离级别(层级递增)

Read Uncommitted 未提交读

通常是大部分数据库采用的默认隔离界别

定义

一个事务可以读取另一个事务并未提交的更新结果

解释

事务中的修改,即使没有提交,其他事务也可以看得到

作用

不可避免 脏读 dirty reads不可重复读 non-repeatable reads幻读 phantom reads

实现

可以通过写操作加“持续-X锁”实现。

Read committed 已提交读

通常是大部分数据库采用的默认隔离界别

定义

一个事务不会读到另一个事务已修改但未提交的数据

解释

一个事务的更新操作结果只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。
保证了一个事务不会读到另一个事务已修改但未提交的数据

作用

避免了 脏读 dirty reads,不可避免 不可重复读取 non-repeatable reads幻读 phantom reads

实现

可以通过写操作加“持续-X”锁,读操作加“临时-S锁”实现。

Repeatable read 可重复读

mysql (InnoDB) 默认隔离级别

定义

保证一个事务不会修改已经由另一个事务读取但未提交 (回滚) 的数据

解释

保证在整个事务的过程中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔数据的更新提交与否。

作用

避免了 脏读 dirty reads不可重复读取 non-repeatable reads, 不可避免 幻读 phantom reads

实现

行锁
可以通过写操作加“持续-X”锁,读操作加“持续-S锁”实现。

  1. Serializable 可串行化
    最严格的隔离级别

定义

所有的事务操作都必须顺序 (串行) 执行

解释

完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
避免其他隔离级别所遇到的所有问题,最安全,性能最差的隔离级别。

作用

并发度下降,吞吐量上不去,极大影响系统性能,很少场景会使用。

实现

表锁 | 范围锁


Isolation Level Lost Updates Dirty Reads Non-repeatable Reads Phantom Reads
read uncommitted don't occur (不可能发生) may occur (可能发生) may occur may occur
read committed don't occur don't occur may occur may occur
repeatable read don't occur don't occur don't occur may occur
serializable don't occur don't occur don't occur don't occur
上一篇 下一篇

猜你喜欢

热点阅读