> 文章列表 > mysql数据库事务脏读、不可重复度、幻读详解

mysql数据库事务脏读、不可重复度、幻读详解

mysql数据库事务脏读、不可重复度、幻读详解

文章目录

  • 1 事务隔离级别
  • 2 脏读
  • 3 不可重复度
    • 3.1 解决了脏读的问题。
    • 3.2 有不可重复度的问题
  • 4 幻读
    • 4.1 没有脏读和不可重复读的问题
    • 4.2 有幻读的问题
    • 5 serializable

1 事务隔离级别

  • read-uncommitted:脏读、不可重复度、幻读,均可出现。安全性低,性能高。
  • read-committed(oracle默认):不可重复度、幻读。避免了脏读。
  • repeatable-read(mysql默认):幻读。避免了脏读、不可重复度。
  • serializable:避免了脏读、不可重复度、幻读。安全性高,性能低。

2 脏读

开启两个窗口:

  • 查询事务默认的隔离级别
 select @@transaction_isolation;
  • 设置隔离级别为read-uncommitted
set session transaction isolation level read uncommitted;

mysql数据库事务脏读、不可重复度、幻读详解

  • 开启事务
 start transaction;

mysql数据库事务脏读、不可重复度、幻读详解

  • 脏读就是读到了其他事务,未提交的数据。read-uncommitted
  • 查询数据的时候会有错误。

3 不可重复度

  • 设置事务隔离级别为read-committed
set session transaction isolation level read committed;

3.1 解决了脏读的问题。

mysql数据库事务脏读、不可重复度、幻读详解

3.2 有不可重复度的问题

mysql数据库事务脏读、不可重复度、幻读详解

4 幻读

  • 设置隔离级别
set session transaction isolation level repeatable read;

4.1 没有脏读和不可重复读的问题

mysql数据库事务脏读、不可重复度、幻读详解

4.2 有幻读的问题

mysql数据库事务脏读、不可重复度、幻读详解

5 serializable

设置事务隔离级别为serializable,脏读、不可重复读、幻读的问题都不存在,但是性能最低。

set session transaction isolation level serializable;

串行化:事务并发时,A事务提交后,B事务才能提交。