数据库隔离级别
一、数据库隔离级别
数据库有四种隔离级别,从低到高,分别是:
- 未提交读(Read uncommitted):即一个事务能读到另一个事务未提交的数据。
- 提交读(Read committed):即当事务对数据所做的修改还未提交时,其他事务都只能读到老的数据。
- 可重复读(Repeated Read):即当有事务操作数据时,不管是读还是写,只要事务还未提交,其他事务就不能修改这条数据。
- 串行读:完全串行化,每次读写都要获取表级锁。
数据库中默认的隔离级别是“可重复读”。
二、隔离级别实现方案
各种隔离级别都是通过在不同的时间加不同的锁实现的。
- 未提交读:读的时候不加任何锁。在修改数据的时候只加行级共享锁。
- 提交读:读的时候对数据加行级共享锁,读完立刻释放锁。在修改的时候,对数据加行级排他锁,直到事务结束才释放。
- 可重复读:读的时候对数据加行级共享锁,直到事务结束才释放。在修改的时候,对数据加行级排他锁,直到事务结束才释放。
- 串行读:读的时候对数据加表级共享锁,知道事务结束才释放。修改的时候,对数据加表级排他锁,知道事务结束才释放。
三、数据库在没有隔离级别的情况下,会出现的问题
- 脏读:即事务A读到事务B修改后的数据,但是事务B失败回滚了,导致事务A之前读到的数据是错误的。
- 不可重复读:即同一个事务读同一条记录,多次读会读到不同结果。因为期间有其他事务对数据进行了修改。
- 幻读:即同一个事务根据一个条件能查到n条数据,过了一段时间,再查时,发现变成n+1条。
四、不同事务隔离级别,能解决的数据库读取问题
“能”表示能解决,“否”表示不能解决。
| 脏读 | 不可重复读 | 幻读 | |
| 未提交读 | 否 | 否 | 否 |
| 提交读 | 能 | 否 | 否 |
| 可重复读 | 能 | 能 | 否 |
| 串行读 | 能 | 能 | 能 |
五、 数据库操作
1. 查询数据库隔离级别:
SELECT @@tx_isolation
2. 修改数据库隔离级别:
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ| SERIALIZABLE}
- 隔离级别名称可选值:READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE
- global:设置全局session,但当前session不受影响。
- session,设置当前和之后的所有session。
- 都不写:设置当前session下一个还未开始的事务。

浙公网安备 33010602011771号