mysql事务的隔离级别

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
读已提交(read-committed)
可重复读(repeatable-read)
串行化(serializable)

 

读未提交(READ UNCOMMITTED)(产生脏读)

  1. 开启两个会话A B

  2. 设置A的隔离级别为 READ UNCOMMITTED

  3. 开启一个会话B,并且启动一个事务

  4. B更新数据(不提交)

  5. A查询到B未提交的数据

  6. A查询的是B的脏数据

==脏读的解决方案: 设置隔离级别为READ COMMITTED==

读已提交(READ COMMITTED)(产生不可重复读)

  1. 开启两个会话A B

  2. 设置A的隔离级别为 READ COMMITTED

  3. 开启会话B,并且启动一个事务

  4. B更新数据(提交)

  5. A能查看到B提交的数据

  6. B更新数据(提交)

  7. A又能查看到B更新的数据

     

    ==同一个事务A中,出现了两次不同的结果(不可重复读)==

    ==不可重复读的解决方案: 设置隔离级别为REPEATABLE READ==

重复读(REPEATABLE READ)

  1. 开启两个会话A B

  2. 设置A的隔离级别为 REPEATABLE READ

  3. 开启会话B,并且启动一个事务

  4. B更新数据(提交)

  5. A不能查看到B提交的数据

  6. B更新数据(提交)

  7. A不能查看到B更新的数据

  8. A提交事务之后再查询,能看到B更新之后的数据

理论上说会产生幻读 但是这个问题被mysql自己解决了 所以这个隔离级别(也是默认级别)并不会产生幻读 要想测试幻读 需要用读已提交的隔离级别 

串行化

锁表  最安全  但是效率太低  基本上不用

 

常用的隔离级别就是默认的可重复读

你可能感兴趣的:(mysql事务的隔离级别)