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';`
- MySQL 5.7.20版本之前:
-
设置隔离级别
-
方式一:
SET [GOLBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别 -
方式二:
SET [GLOBAL|SESSION] TRANSACTION ISOLATION = '隔离级别'- GLOBAL:在全局访问影响,对已存在的会话无效(只对执行完后新的会话有效)
- SESSION:在会话服务影响,对当前会话后续事务有效,并且不会影响当前正在执行的事务
-
总结
从上往下隔离级别越高,并且隔离级别越高,数据一致性越好,但并发性越弱。