文章目录
推荐学习
MySQL基础笔记(1)-深入理解索引
一.事务
1.什么是事务
事务指的是一组操作,要么都执行,要么都不执行。最经典的例子就是转账的例子:A向B转账,如果A扣款了B就必须得到钱。但是如果在这个过程中发生了系统错误,A没有扣款,那么B也不会得到钱,这就是扣款和加钱这一组操作的事务性。
2.事务四大特性(ACID)
1.Atomic-原子性
事务是最小的单位,事务内的操作要不都成功,要不都失败。
2.Consistency-一致性
事务执行前后的数据被其他事物读取到时都是一致的。
3.Isolation-隔离性
多个事务之间同时执行也不会相互干扰,各事务相对独立。
4.Durability-持久性
事务执行之后,它对数据的改变是持久的,不会发生回退。
3.并发事务带来的四大问题
1.脏读
A事务读取了B事务的未提交的脏数据,导致A事务之后的操作都是错误的。
2.不可重复读
A事务读取数据后,B事务执行更新操作,导致A事务无法读取到原先的结果。
3.幻读
A事务读取数据后,B事务新添加了数据,导致A事务无法读取到原先的结果。
4.更新丢失
指的是A事务回滚而导致B事务的更新被撤销。
Q:不可重复读和幻读有什么不同?
不可重复读指的是A事务读取某条数据期间,B事务改变了该条数据,导致A的前后读取结果不一致,要解决这个问题只需要加行级锁,使A事务开启期间读取某条数据,其他事务不可对该条数据进行更改即可。
而幻读指的是A事务读取多条数据期间,B事务新增了数据,导致A的前后读取结果不一致,要解决这个问题需要加表级锁,使A事物读取多条数据期间,其他事务都无法更改该表的数据。
二.数据库锁机制
按锁定的对象的不同,一般可以分为表锁定和行锁定,前者对整个表进行锁定,而后者对表中特定行进行锁定。从并发事务锁定的关系上看,可以分为共享锁定和独占锁定。共享锁定会防止独占锁定,但允许其他的共享锁定;而独占锁定既防止其他的独占锁定,也防止其他的共享锁定。
1.四种事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读
– | – | – |-- |–
读未提交 | √ | √ | √ |
读已提交 | x | √ | √ |
可重复读 | x | x | √ |
串行化 | x | x | x |
其中可重复读为InnoDB的默认事务隔离级别。
2.InnoDB存储引擎的锁算法
- Record Lock:对单行数据上锁
- Gap Lock:间隙锁,锁定一个范围但不包括其自身
- Next-Key Lock:Record Lock + Gap Lock,即对某个范围上锁,包括自身。
Q:三种锁算法在什么时候使用?
- 对单行数据的修改:Record Lock,锁定单行
- 对范围数据的修改:Next-Key Lock:锁定该范围的数据
3.MVCC-多版本并发控制
MVCC指的是多版本并发控制技术。 InnoDB引擎默认的隔离级别是RR(可重复读),可是却能够解决幻读问题,原因就在于采用了MVCC技术。
MVCC技术的实现:在事务对范围内数据进行读取时,首先InnoDB为该事务分配一个版本号(默认加1),然后在事务查询的过程中只会查询到小于该事务版本号的数据,这时无论是否有其他事务改变了该范围内的数据都能够查询到同一结果,因为若其他事务改变了这些数据,那么就会产生更大的版本号,不会被查询到。
Thanks
- https://segmentfault.com/a/1190000012650596
- https://www.jianshu.com/p/8d735db9c2c0