SQL中的四种隔离级别

88 阅读2分钟

READ UNCOMMITTED(读未提交)

  • 所有事务都可以看到其他未提交事务的执行结果
  • 不可避免:脏读、不可重复读、幻读。

READ COMMITED(读已提交)

  • 事务只能看到已提交事务所做的改变;
  • 可以避免:脏读
  • 不可避免:不可重复读、幻读
  • 这是大多数数据库系统默认的隔离级别(MySQL默认是REPEATABLE READ级别)。

REPEATABLE READ(可重复读):MySQL默认事务级别

  • 确保事务A可以多次从一个字段中读取相同的值,在这个事务A工作期间,禁止其他事务对其读取字段的更新;
  • 事务A在读取一条数据n后,事务B对数据n进行修改并提交,事务A再读取数据n时还是会最初的内容。
  • 不可避免:幻读
  • 可以避免:脏读、不可重复读

SERIALIZABLE(可串行化)

  • 确保事务在一个表读取相同的行:在某个事务持续期间,禁止其他事务对已被读取的表进行插入、更新、修改操作。
  • 可避免所有并发问题(脏读、不可重复读、幻读),但效率十分低下

MySQL中对于隔离级别的查看、修改

  • 查看隔离级别:

    • MySQL 5.7.20版本之前:SHOW VARIABLES LIKE 'tx_isolation';
    • MySQL 5.7.20版本之后:SHOW VARIABLES LIKE 'transaction_isolation';`
  • 设置隔离级别

    • 方式一:SET [GOLBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别

    • 方式二:SET [GLOBAL|SESSION] TRANSACTION ISOLATION = '隔离级别'

      • GLOBAL:在全局访问影响,对已存在的会话无效(只对执行完后新的会话有效)
      • SESSION:在会话服务影响,对当前会话后续事务有效,并且不会影响当前正在执行的事务

总结

从上往下隔离级别越高,并且隔离级别越高,数据一致性越好,但并发性越弱。

image.png