MySQL隔离级别
事务隔离级别
事务隔离级别,会影响事务中会产生脏读、幻读、不可重复读等相关问题
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(Read Uncommitted) | √ | √ | √ |
读已提交(Read Committed) | X | √ | √ |
可重复度(Repeatable Read) | X | X | √ |
串型(Serializable) | X | X | X |
- 读未提交(Read Uncommitted)
可能读到其他会话未提交事务修改的数据,存在脏读、不可重读读、幻读的问题 - 读已提交(Read Committed)
只能查询到已提交的数据。
Oracle 默认的事务隔离级别。存在不可重读读、幻读的问题 - 可重复读(Repeatable Read)
无论什么时候查到的数据都和第一次查到的一致。
MySQL 数据库 InnoDB 引擎默认的事务隔离级别。
在范围查询时存在幻读的问题 - 串行(Serializable)
是最高的事务隔离级别,它严格服从 ACID 特性的隔离级别
所有的事务依次逐个执行,事务之间互不干扰
但每个事务读数据时都需要获取表级的共享锁,导致读和写都会阻塞,性能极差
设置事务隔离级别
- 永久设置
在 my.cnf、my.ini 文件中添加设置:
transaction-isolation=READ-UNCOMMITTED
- 临时设置
# SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
set session transaction isolation level READ UNCOMMITTED;
查询事务隔离级别
# MySQL < 8
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
# MySQL >= 8.0
SELECT @@global.transaction_isolation;
SELECT @@session.transaction_isolation;
SELECT @@transaction_isolation;
逃避不一定躲得过,面对不一定最难过