MYSQL事务隔离级别

事务的隔离级别分为:未提交读(READ UNCOMMITTED)、已提交读(READ COMMITTED)、可重复读(REPEATABLE READ)、串行化(SERIALIZABLE)。

mysql数据库,当且仅当引擎是InnoDB,才支持事务

  • 未提交读 (READ UNCOMMITTED)

A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;—出现脏数据(脏读)

  • 已提交读 (READ COMMITTED)

A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,前后两次数据不一致;—不可重复读,可以解决脏读

  • 可重复读 (REPEATABLE READ)

A事务无论执行多少次,只要不提交,B事务查询值都不变;B事务仅查询B事务开始时那一瞬间的数据快照;—mysql默认的,可以解决脏读 和 不可重复读

  • 串行化 (SERIALIZABLE)

不允许读写并发操作,写执行时,读必须等待。—相当于锁表,可以解决 脏读 不可重复读 和 虚读

查看隔离级别

全局事务级别:

1
SELECT @@GLOBAL.tx_isolation  或 SELECT @@GLOBAL.transaction_isolation

会话事务级别:

1
SELECT @@SESSION.tx_isolation 或 SELECT @@SESSION.transaction_isolation

或者

1
show variables like '%iso%';

设置隔离级别

临时有效

1
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

持久有效

1
2
3
[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF
关注作者公众号,获取更多资源!
赏作者一杯咖啡~