目标:设置Mysql的事务隔离级别
查看当前事务隔离级别
Mysql8.0
SELECT @@transaction_isolation;
Mysql5.6
警告⚠️:在Mysql8.0.3及以后的版本中弃用
SSELECT @@tx_isolation;
设置事务隔离
四种事务隔离级别
- READ UNCOMMITTED(读未提交): 最低的隔离级别,允许事务看到其他未提交事务的修改。这可能会导致所谓的“脏读”现象,也就是一个事务读取到另一个事务未提交的修改。
- READ COMMITTED(读已提交): 较高的隔离级别,只允许事务读取其他已提交事务的修改。这避免了脏读,但仍可能出现不可重复读和幻读现象。
- REPEATABLE READ(可重复读): 更高的隔离级别,确保在同一个事务中多次读取同一数据的结果是一致的。这是MySQL的默认事务隔离级别。它避免了脏读和不可重复读,但在某些情况下可能会出现幻读。
- SERIALIZABLE(串行化): 最高的隔离级别,会在读取的每一行数据上都加锁,从而阻止其他事务进行并发修改。这避免了脏读、不可重复读和幻读,但是性能开销也最大。
具体设置
提示:Mysql5.6和Mysql8设置事务隔离的方式是一样的。
样例
-- 样例 SESSION:只影响当前会话 | GLOBAL: 全局设置
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL 级别名称;
READ UNCOMMITTED(读未提交)
-- READ UNCOMMITTED(读未提交)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
READ COMMITTED(读已提交)
读已提交:为Oracle的默认事务隔离级别
-- READ UNCOMMITTED(读未提交)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
REPEATABLE READ(可重复读)
可重复读:为Mysql的默认事务隔离级别
-- REPEATABLE READ(可重复读)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SERIALIZABLE(串行化)
-- SERIALIZABLE(串行化)
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Mysql不同隔离级别的对照
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | ❌ | ❌ | ❌ |
读已提交 | ✅ | ❌ | ❌ |
可重复读 | ✅ | ✅ | 部分✅ |
串行化 | ✅ | ✅ | ✅ |
注释
- 脏读:读到了其他事务未提交的数据
- 不可重复读:同样的查询,读到的数据内容不一致
- 幻读:同样的查询读到了更多的数据
Comments NOTHING