事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
读未提交(READ UNCOMMITTED)(产生脏读)
-
开启两个会话A B
-
设置A的隔离级别为 READ UNCOMMITTED
-
开启一个会话B,并且启动一个事务
-
B更新数据(不提交)
-
A查询到B未提交的数据
-
A查询的是B的脏数据
==脏读的解决方案: 设置隔离级别为READ COMMITTED==
读已提交(READ COMMITTED)(产生不可重复读)
-
开启两个会话A B
-
设置A的隔离级别为 READ COMMITTED
-
开启会话B,并且启动一个事务
-
B更新数据(提交)
-
A能查看到B提交的数据
-
B更新数据(提交)
-
A又能查看到B更新的数据
==同一个事务A中,出现了两次不同的结果(不可重复读)==
==不可重复读的解决方案: 设置隔离级别为REPEATABLE READ==
重复读(REPEATABLE READ)
-
开启两个会话A B
-
设置A的隔离级别为 REPEATABLE READ
-
开启会话B,并且启动一个事务
-
B更新数据(提交)
-
A不能查看到B提交的数据
-
B更新数据(提交)
-
A不能查看到B更新的数据
-
A提交事务之后再查询,能看到B更新之后的数据
理论上说会产生幻读 但是这个问题被mysql自己解决了 所以这个隔离级别(也是默认级别)并不会产生幻读 要想测试幻读 需要用读已提交的隔离级别
串行化
锁表 最安全 但是效率太低 基本上不用
常用的隔离级别就是默认的可重复读