Mysql设置事务隔离级别方法

发布于 2023-05-03  459 次阅读


目标:设置Mysql的事务隔离级别

查看当前事务隔离级别

Mysql8.0

SELECT @@transaction_isolation;

Mysql5.6

警告⚠️:在Mysql8.0.3及以后的版本中弃用

SSELECT @@tx_isolation;

设置事务隔离

四种事务隔离级别

  1. READ UNCOMMITTED(读未提交): 最低的隔离级别,允许事务看到其他未提交事务的修改。这可能会导致所谓的“脏读”现象,也就是一个事务读取到另一个事务未提交的修改。
  2. READ COMMITTED(读已提交): 较高的隔离级别,只允许事务读取其他已提交事务的修改。这避免了脏读,但仍可能出现不可重复读和幻读现象。
  3. REPEATABLE READ(可重复读): 更高的隔离级别,确保在同一个事务中多次读取同一数据的结果是一致的。这是MySQL的默认事务隔离级别。它避免了脏读和不可重复读,但在某些情况下可能会出现幻读。
  4. 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不同隔离级别的对照

隔离级别脏读不可重复读幻读
读未提交
读已提交
可重复读部分✅
串行化

注释

  1. 脏读:读到了其他事务未提交的数据
  2. 不可重复读:同样的查询,读到的数据内容不一致
  3. 幻读:同样的查询读到了更多的数据
届ける言葉を今は育ててる
最后更新于 2023-06-01