数据库隔离级别
事务的特性
- 原子性
较低的级别的通常可以执行更高的并发
READ UNCOMMITED(未提交读)
事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的事务,这也叫脏读。
因为性能不会比其他级别好太多,一般很少用
READ COMMITED(提交读)
大多数数据库系统的默认隔离级别(MySQL不是),一个事务开始时,只能“看见”自己已经提交的事务所做的修改,提交之前的修改对其他事务都是不可见的。
该隔离级别也叫不可重复读,因为执行两次查询,可能得到不一样的结果
REPEATABLE READ(可重复读)
保证一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据,但不能避免产生幻读。
幻读:指当前的事务在读取某个符合条件范围的记录时,另外一个事务又在该范围内插入了新的记录,导致当前事务再次读取该范围的记录时,发现多了N条数据(幻行)
SERIALIZABLE(可串行化)
最高的隔离级别,强制事务串行执行,避免了幻读问题。SERIALIZABLE会在读取每一行数据上都加上锁,所以可能导致大量的超时和锁争用问题。
隔离级别 | 脏读 | 不可重复读 | 幻读 | 读锁 |
---|---|---|---|---|
READ UNCOMMITED | Yes | Yes | Yes | No |
READ COMMITTED | No | Yes | Yes | No |
REPEATABLE READ | No | No | Yes | No |
SERIALIZABLE | No | No | No | Yes |