文章目录
- 何为事务?
- 什么是事务的ACID特性?
- 并发事务带来了哪些问题?
- 不可重复读和幻读有什么区别?
- 并发事务的控制方式有哪些?
- SQL标准定义了哪些事务隔离级别?
- MYSQL的隔离级别是基于锁实现的吗?
何为事务?
事务是逻辑上的一组操作,要么都执行,要么都不执行
什么是事务的ACID特性?
- A(原子性):事务是最小的执行单位,不允许分割
- C(一致性):执行数据前后,数据保持一致
- I(隔离性):并发访问数据库时,一个用户的事务不被其他的事务所干扰,各并发事务之间数据库是独立的
- D(持久性):一个事务被提交后,它对数据库的改变是持久的,即使数据库发生故障也不应该对其有任何影响
注意:A,I,D是手段,C是目的
并发事务带来了哪些问题?
多个事务并发执行,多个用户对同一用户进行操作,可能会出现以下问题
脏读
一个事务修改了数据,但未提交,此时另一个事务读取了这个还未提交的事务,但是第一个事务突然回滚,导致数据并未提交到数据库,这里第二个事务读取到的就是脏数据
丢失修改
一个事务读取到一个数据时,另一个事务也访问了该数据,第一个事务对数据进行修改,另一个事务又修改了这个数据,这样第一个事务内的修改结果就被丢失
不可重复读
一个事务内多次读同一个数据,期间另外一个事务对数据进行修改,使得第一个事务两次读到的内容不一致
幻读
一个事务读取了数据,接着另外的并发事务插入了一些数据,则前一个事务再次读取数据时,发现多出了一些记录,像幻觉一样!
不可重复读和幻读有什么区别?
不可重复读重点是多次读取数据发现其中某些记录的值被修改
幻读重点是多次读取数据发现查到的记录增加了
幻读可以看成是不可重复读的一种特殊情况,区分是因为解决两者的方案不一样
并发事务的控制方式有哪些?
锁和MVCC (todo 完善)
SQL标准定义了哪些事务隔离级别?
- READ-UNCOMMITTED(读取未提交)
- READ-COMMITTED(读取已提交)
- **REPEATABLE-READ(可重复读) : **InnoDB存储引擎支持的默认隔离级别
- SERIALIZABLE(可串行化)
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
MYSQL的隔离级别是基于锁实现的吗?
是基于锁和MVCC机制共同实现的
SERIALIZABLE 是通过锁来实现的,READ-COMMITTED和REPEATABLE-READ是基于MVCC实现的