诚意满满系列每一篇都是精挑细选,从大众知识点到原理再到具体实现,争取把一个知识点从头到尾完整讲下来,足以应付面试与工作。让读者读完之后能够有一种:“这个知识我看这一篇就够了”的感觉是本系列最大愿望。
对于本人而言,在之前的学习中也发现,八股文讲得细致但不系统,而系统的学习往往又宽泛不细致,所以也打算取长补短,互相结合一下,欢迎大家收藏关注,持续更新。
事务
事务的常见定义:
事务是一种用于管理数据库操作的机制,它可以确保数据库的一组操作要么全部成功执行,要么全部回滚到初始状态,保证数据的一致性和完整性
换个角度来说,事务相当于将多个操作合并成一个操作,这个操作只有成功和失败两种结果,没有中间状态,就跟cpu指令一样,一个指令要么不执行,要么完全执行。当然,这么说是理想状态(懂得都懂),实际上不同的事务隔离级别会有不同效果,后文会详细讲到。
事务的四个特性:
-
原子性(Atomicity):事务中的所有操作要么都成功完成,要么都失败回滚。即事务是不可分割的,要么全部执行,要么全部不执行,不会出现部分执行的情况。
-
一致性(Consistency):事务的执行不会破坏数据库的一致性约束。在事务开始前和结束后,数据库的状态必须满足一定的一致性规则。
-
隔离性(Isolation):同一时间多个并发事务的执行互不干扰,每个事务都认为它是唯一正在执行的事务。事务的隔离性可以防止并发执行事务时出现脏读、不可重复读和幻读的问题。
-
持久性(Durability):一旦事务提交,其所做的修改将被永久保存在数据库中,即使系统发生故障,重新启动后也能够恢复到事务提交后的一致状态。持久性确保事务的结果是可靠的,不会因为系统故障而丢失。
原子性和持久性很好理解,隔离性会放到事务隔离级别里面会更好理解一点,暂不赘述。
单独讲讲一致性
一致性有点抽象,一致性的意思是说,嗯。。。,事务的执行不会破坏数据库的一致性约束。
咳,重点在这两句话的加粗字体:
1、事务的执行不会破坏数据库的一致性约束。
2、在事务开始前和结束后,数据库的状态必须满足一定的一致性规则。
拿耳熟能详的交易例子来说,假设在交易系统里只有两个人A和B,两个人的余额总额200块,无论两个人如何交易,最后两个人的余额加起来一定是=200。那么,这个“所有余额相加=200”就是一个一致性约束。
这时候*大的举手了:这个看起来是应用层的设定,好像和数据库没有关系?
没错,你可以理解一致性就是:应用系统从一个正确的状态到另一个正确的状态.而ACID就是说事务能够通过AID来保证这个C的过程.C是目的,AID都是手段
用《数据密集型系统分析与设计》中的一句话来说:
"ensuring the consistency is the responsibility of user, not DBMS."(保证一致性是用户的责任,而非数据库)
一个应用的一致性约束是什么,取决于具体的业务(像交易系统的总额不变),这个是由用户决定的,而不是数据库。数据库承担的作用是,它按照用户给定的事务去正常执行、提交或回滚后,不会破坏这个一致性约束。
前提是用户给的代码没有bug。如果在一次交易中,用户分成两个事务提交:买的提交一次,卖的提交一次,一旦在买和卖中间宕机,最后的总额对不上是板上钉钉的事。
因此,保证一致性是用户的责任,而非DBMS。
开胃菜先简短一点,后面还有
- 事务的隔离级别以及不同隔离级别面临的问题
- mysql如何实现事务隔离