MySQL Isolation Levels
MySQL Isolation Levels
事务的四大特性 ACID(Atomicity, Consistency, Isolation, Durability), 这里只看 I
: Isolation.
MySQL InnoDB Isolation Levels
InnoDB 的隔离性的默认值为 REPEATABLE-READ
, 也可以通过SQL修改当前 SESSION
的或者 GLOBAL
的隔离性.
隔离级别主要针对读取数据的一方, 限定自身可以读到什么阶段的数据.
关于 MySQL 隔离级别的设置:
Syntax | Affected Characteristic Scope |
---|---|
SET GLOBAL TRANSACTION transaction_characteristic |
Global |
SET SESSION TRANSACTION transaction_characteristic |
Session |
SET TRANSACTION transaction_characteristic |
Next transaction only |
Syntax | Affected Characteristic Scope |
---|---|
SET GLOBAL var_name = value |
Global |
SET @@GLOBAL.var_name = value |
Global |
SET PERSIST var_name = value |
Global |
SET @@PERSIST.var_name = value |
Global |
SET PERSIST_ONLY var_name = value |
No runtime effect |
SET @@PERSIST_ONLY.var_name = value |
No runtime effect |
SET SESSION var_name = value |
Session |
SET @@SESSION.var_name = value |
Session |
SET var_name = value |
Session |
SET @@var_name = value |
Next transaction only |
值得注意的是, 当我们使用 SET TRANSACTION transaction_characteristic
或者 SET @@var_name = value
, 只会影响到下一个事务, 当然这也正是我们想要的(大部分情况).
以下都在普通 SELECT
下进行.
READ UNCOMMITTED
该级别下, 可以读到未经提交的事务.
如果对面的事务中途 Rollback 了, 刚刚读到的数据也就是无效的数据. 此所谓 脏读
.
READ COMMITTED
该级别下, 只可读到已经提交的事务(读不到还未提交的事务).
如果本事务中有两个查询, 在两次查询之间有其他事务修改了相关的数据. 在该级别的事务中, 两次条件相同的读操作, 得到的数据不一致. 此所谓 不可重复读
.
REPEATABLE READ
该级别下, 只可读到已经提交的事务, 并且能保证同一个事务内可重复读.
如果本事务中有两个查询, 在两次查询之间有其他事务修改了相关的数据. 在该级别的事务中, 两次条件相同的读操作, 得到的数据相同. 即本事务的第二次查询, 读不到其他事务刚刚已经提交的相关数据.
如果本事务要更新一批数据, 其他事务插入了一些相关的新数据, 本事务将更新不到新插入的数据. 此所谓 幻读
.
SERIALIZABLE
该级别下, 只能读到已经提交的事务, 并且能保证同一个事务内可重复读, 并且会阻塞其他事务向查询的区间插入新数据(若插入的数据不在区间内, 则可以正常插入).
Sum-up
Isolation Level | Dirty Read | NonRepeatable Read | Phantom Read |
---|---|---|---|
READ UNCOMMITTED | √ | √ | √ |
READ COMMITTED | × | √ | √ |
REPEATABLE READ | × | × | √ |
SERIALIZABLE | × | × | × |
Read More:
https://dev.mysql.com/doc/refman/8.0/en/set-transaction.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html