数据库事务系列1 事务概述 事务分类
Posted 小耶哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库事务系列1 事务概述 事务分类相关的知识,希望对你有一定的参考价值。
数据库事务系列初步预期为5篇文章(均无超链接, 因为文章还没推送给大家)
数据库事务系列1 事务概述 事务分类
数据库事务系列2 事务实现 redo
数据库事务系列3 undo
数据库事务系列4 事务控制语句 隔离级别
数据库事务系列5 分布式事务及其他
1.事务概述
事务可以由一条非常简单的sql语句组成,也可以由一组复杂的sql语句组成。事务是访问并更新数据库中各项数据项的一个程序执行单元。
原子性(Atomic):整个数据库事务是不可分割的工作单位,一个事务中的所有数据库的操作都成功,才算整个事务的成功,否则,只要有一条sql执行失败,那么整个事务执行失败。
一致性(Consistency): 事务将数据库从一种一致性状态转变为下一种一致性状态。
隔离性(isolation):隔离性还有其他的称呼,如并发控制、可串行化、锁等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,这通常通过锁来实现。
持久性(durability): 事务一旦提交,其结果就是永久的。
因此,持久性保证事务系统的高可靠性,而不是高可用性,对于高可用性的实现,事务本身并不能保证,需要一些系统共同配合来完成。
苏州天平山初冬美景 宋老师摄于2019年冬
2.事务的分类
事务的类别:
扁平事务
带有保存点的扁平事务
链事务
嵌套事务
分布式事务
扁平事务:
事务中最简单的一种,所有操作处于同一个层次, 由begin开启事务, 由rollback或者commit来结束事务,期间的操作都是原子的。
扁平事务的主要限制是:不能提交或者回滚事务的某一部分,或者分几个步骤提交。假设某个事务分三步走,如果前两个步骤需要耗费很多时间,那么即使只是第三个步骤出错,也要回滚前两个步骤,显然代价有点大。
也就是说,如果支持有计划的回滚,那么就不需要终止整个事务,因此,就出现了带有保存点的扁平事务。
带有保存点的扁平事务: 除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态。
这是因为某些事务可能在执行过程中出现的错误并不会导致所有的操作都无效,放弃整个事务不合乎要求,开销也太大。
保存点用来通知系统应该记住事务的当前状态,以便在之后发生错误时,事务能回到保存点当时的状态。
带有保存点的扁平事务,当系统崩溃时,所有的保存点都将消失,因为其保存点是易失的,而不是持久的。这意味着当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行。
链事务:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。注意,提交事务和开始下一个事务将合并为一个原子操作。这意味着下一个事务将看到上一个事务的结果,就好像在一个事务中进行一样。
链事务与带有保存点的扁平事务的不同之处是,带有保存点的扁平事务能回滚到任意正确的保存点,而链事务中回滚仅限于当前事务,即只能恢复到最近一个保存点。
嵌套事务:是一个层次结构架构。
由一个顶层事务控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务,其控制每一个局部的变换。
下面是Moss对嵌套事务的定义:
1. 嵌套事务是由若干事务组成的一棵树,子树既可以是嵌套事务,也可以是扁平事务。
2. 处在叶节点的事务是扁平事务。但是每个子事务从根到叶节点的距离可以是不同的。
3. 处于根节点的事务称为顶层事务,其他事务为子事务。事务的前驱为父事务,事务的下一层是儿子事务。
4. 子事务既可以提交,也可以回滚。但是它的提交操作并不会马上生效,除非其父事务已经提交。因此,任何子事务都在顶层事务提交后才能真正提交。
5. 树中任意一个事务的回滚会引起它的所有子事务的一同回滚,故子事务仅保留A、C、I特性,不具有D的特性。
在Moss理论中,实际的工作都是由叶子事务来完成的,只有叶子事务才能访问DB、发送消息、获取其他资源。而高层事务仅负责逻辑控制,决定何时调用相关的子事务。
分布式事务:通常是一个在分布式环境下运行的扁平事务,因此需要根据数据所在的位置访问网络中的不同节点。
示例:用户在ATM机上,从招商银行卡转账10000到工商银行卡上。可以将ATM机视为节点A,招商银行的后台数据库视为节点B,工商银行的后台数据库视为节点C, 这个转账过程分为以下几步:
1. 节点A发出转账指令;
2. 节点B从余额扣减10000;
3. 节点C给余额加10000
4. 节点A通知用户操作完成或者失败。
这里需要用到分布式事务,因为需要访问两个节点的数据库,而在每个节点的数据库执行的事务又都是扁平的。
对于这五种事务,innodb除了不原生支持嵌套事务,其他都支持。
然而,用户可以通过带有保存点的扁平事务来模拟串行的嵌套事务。
往期回顾
InnoDB存储引擎系列
75道BAJT高级Java面试题专题
运维专家专题
经典回顾
微信支付专题
参考资料
1 | CSDN
责编 | 小耶哥
本期作者 | 才高7缸
平台建设及技术支持 | 小耶哥
以上是关于数据库事务系列1 事务概述 事务分类的主要内容,如果未能解决你的问题,请参考以下文章