- 事务特性 ACID
- 事务隔离中的脏读、幻读问题
- 隔离级别
一、事务特性 ACID
【原子性】Atomicity
一个事务内多个操作语句,不可被分割。(一个事务的执行结果,要么全部成功,要么全部失败)
【一致性】Consistency
一个事务操作之后, 数据库所处的状态和业务规则是一致的。
【隔离性】Isolation
多个事务之间相互独立,不能相互影像。
但实际数据实现分为不同级别:
- 未提交(Read UnCommitted)
- 读提交(Read Committed)
- 可重复读(Repeatable Read)
- 串行化(Serializable)
【持久性】Durability,
- 事务提交后被持久化,永久存储.
二、脏读、幻读问题
【脏读】
读到了别人没提交的数据,别人没有做commit操作的数据被读取。
其他事务
未提交的数据 ,被当前事务提取。
【幻读】
同样的条件的select, 第1次和第2次读出来的记录数不一样。幻读的重点在于新增或者删除。
同一个事务中,多次执行同一个select。 读取到的数据行数
发生改变。也就是数据行数
减少或者增加了 (被其它事务delete/insert并且提交)。
【不可重复读】:
不可重复读的重点是修改,同样的条件的select, 你读取过的数据, 再次读取出来发现值不一样了
同一个事务中,多次执行同一个select。读取到的数据
发生了改变(被其它事务update并且提交)。
【可重复读】
同一个事务中,多次执行同一个select。读取到的数据
没有发生改变(一般使用MVCC实现);
三、事务隔离级别
隔离级别,研究在同一个事务内,两次执行查询 select 出现的不一致容忍度问题;
【脏读】、【不可重复读】、 【幻读问题】
简写 | 隔离级别 Isolation Level | 中文 | 脏度 Dirty Read | 不可重复读 Unrepeatable Read | 幻读 Phantom Read |
---|---|---|---|---|---|
RU | Read UnCommited | 读取未提交数据 | √ | √ | √ |
RC | Read Commited | 读取提交数据 | √ | √ | |
RR | Read Repetable | 可重复读 | √ | ||
S | Serializable | 串行 |
从上表可以看出:
- RC 容忍【不可重复读】、【幻读】。
- RR 仅容忍 【幻读】。
- 但MySQL 在具体实现上会有差异。
3.1 Mysql 与 Oracle 差异
MySQL 默认采用RR隔离级别之外,其它几大数据库都是采用RC隔离级别。
Oracle 仅实现了 RC 、SERIALIZABLE 隔离级别。
- 默认采用RC隔离级别,解决了脏读。但容忍《不可重复读》和《幻读》。
- 其SERIALIZABLE 解决了脏读、不可重复读、幻读。
MySQL 默认采用 RR 隔离级别。
- RR 解决不可重复读的问题,但MySQL 采用了gap lock,所以实际上MySQL的RR隔离级别也解决了幻读的问题。
- SERIALIZABLE采用了经典的实现方式,对读和写都加锁。
3.2 RC 于 RR 区别
在 Where条件过滤时 ;
-
RC 隔离级别,对不符合条件的记录,锁会释放掉,
-
RR 隔离级别,对不符合条件的记录,锁不一定会释放 (虽然违反了“2阶段锁”原则)
-
下面是官方文档中的说明:http://dev.mysql.com/doc/refman/5.6/en/innodb-locks-set.html
四、 间隙锁 gap lock
参考:
- https://blog.csdn.net/u014066037/article/details/68941287