1. 引言
前面我们分别讲了一条sql查询语句是如何执行的? 和一条sql更新语句是如何执行的? 通过这两部分内容,我们了解了mysql的架构,以及不同类型sql的执行流程。同时我们也了解了数据库ACID特性中的Durablity的实现。
- 那么对于Isolation是如何实现的?
- 事物的隔离级别有哪些?要如何选择
- 使用事物时的注意事项?
- 什么是长事物?如何避免长事物?
我们一起来探究这些问题的答案。
提到事物,你肯定不会陌生,和数据库🛢️打交道的时候,我们总会遇到事物。
- 最经典的例子就是转账💲,你要给朋友小王转账100块,此时你的银行卡只有100块。
- 转账过程具体到程序里,会有一系列的操作,比如:查询余额、扣减余额、更新余额等,这些操作必须是一个整体的。不然等程序查完之后,还没做减法之前,你这100块钱,完全可以利用时间差再转一次,如果是这样,银行就会全乱套,这个时候就会用到事物这个概念了。

- 简单来说,事物是一组数据库操作,这些操作,要么全部成功,要么全部失败。
- 在Mysql中,事物是在引擎层实现的。之前我们说过,Mysql是一个支持多引擎的系统,但并不是所有的引擎都支持事物。比如MyISAM就不支持事物,这也是MyISAM被InnoDB取代的重要原因之一。

下面我们以InnoDB为例,剖析Mysql在事物支持方面的特定实现,并基于原理给出相应的实践建议。
2. 隔离性与隔离级别
2.1 事物的特性
提到事物,你肯定会想起来 ACID(atomicity-原子性,consistency-一致性,isolation-隔离性,durability-持久性)。
| 编号 | 英文名称 | 中文名称 | 解释 |
|---|---|---|---|
| 1 | Atomicity(A) | 原子性 | 事务中所有操作要么全部完成,要么全部不完成,不会出现部分完成的情况。如果一个事务中有多个操作,其中任意一个操作失败,则整个事务都会回滚到最初状态。 |
| 2 | Consistency(C) | 一致性 | 事务开始前和结束后数据库的完整性约束没有被破坏。在事务执行过程中,数据库会保持一致性状态,即数据库的数据经过了预定的验证,从一个一致性状态变为另一个一致性状态。 |
| 3 | Isolation(I) | 隔离性 | 并发执行的事务之间是隔离的,每个事务都不能看到其他事务未提交的结果。 |
| 4 | Durability(D) | 持久性 | 当事务成功结束后,它对数据库所做的更改将永久保存,并且即使系统发生故障也不应该丢失。 |
2.2 并行事物的问题
当数据库上有多个事物同时执行的时候,就可能会出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题。为了解决这些问题,才有了隔离级别的概念。
| 编号 | 英文名称 | 中文名称 | 解释 |
|---|
758



被折叠的 条评论
为什么被折叠?



