MySQL:事务(事务的具体分类)

asds事务(Transaction) 是数据库区别于文件系统的重要特性之一。在文件系统中,如果正在写文件,但是操作系统突然崩溃了,这个文件就很有可能被破坏。当然,有一些机制可以把文件恢复到某个时间点。不过,如果需要保证两个文件同步,这些文件系统可能就显得无能为力了。这正是数据库系统引入事务的主要目的:事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所有修改都不保存。

asdsInnoDB 存储引擎中的事务完全符合ACID 的特性。ACID 是以下4 个词的缩写:

ddss①、原子性(atomicity) asddss②、一致性(consistency) asddss③、隔离性(isolation) asddss④、持久性 (durability)

asdsadasdasdasdsadasdasdasdsadassdasdsadasdasdsadasdsadassadasdas————《MySQL技术内幕INNODB存储引擎》


认识事务

概述

ssdss 事务可由一条非常简单的SQL 语句组成,也可以由一组复杂的SQL 语旬组成。事务是访问并更新数据库中各种数据项的一个程序执行单元。 在事务中的操作,要么都做修改,要么都不做,这就是事务的目的,也是事务模型区别与文件系统的重要特征之一。
ssdss 注:理论上说,事务有着极其严格的定义,它必须同时满足四个特性。但是数据库厂商出于各种目的,并没有严格去满足事务的ACID 标准。但是我们要了解ACID。

sssddssA、原子性

ssewddss原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL 语句执行失败,已经执行成功的SQL 语句也必须撤销,数据库状态应该退回到执行事务前的状态。

sssddssB、一致性

ssewddss一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。事务是一致性的单位,如果事务中某个动作失败了,系统可以自动撤销事务一返回初始化的状态。

sssddssC、隔离性

ssewddss隔离性还有其他的称呼,如并发控制(concurrency control) 、可串行化(serializability) 、锁(locking) 等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,通常这使用锁来实现。当前数据库系统中都提供了一种粒度锁(granular lock) 的策略,允许事务仅锁住一个实体对象的子集,以此来提高事务之间的并发度。

sssddssD、持久性

ssewddss事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。 需要注意的是,只能从事务本身的角度来保证结果的永久性。

ssdssdss注:在事务提交后,所有的变化都是永久的。即使当数据库因为崩溃而需要恢复时,也能保证恢复后提交的数据都不会丢失。但若不是数据库本身发生故障,而是一些外部的原因,如RAID 卡损坏、自然灾害等原因导致数据库发生问题,那么所有提交的数据可能都会丢失。因此持久性保证事务系统的高可靠性(High Reliability), 而不是高可用性(High Availab山ty) 。对于高可用性的实现,事务本身并不能保证,需要一些系统共同配合来完成。

分类

sss 从事务理论的角度来说,可以把 事务分为以下几种类型:

dddsdss①、扁平事务( Flat Transactions) dddsdss②、带有保存点的扁平事务(Flat Transactions with Savepoints)

dddsdss③、链事务(Chained Transactions) dddsdss④、嵌套事务(Nested Transactions)

dddsdss⑤、分布式事务(Distributed Transactions)

dds扁平事务:是事务类型中最简单的一种,但在实际生产环境中,这可能是使用最为频繁的事务。 在扁平事务中,所有操作都处于同一层次,其由BEGIN WORK 开始,由COMMIT WORK 或ROLLBACK WORK 结束,其间的操作是原子的,要么都执行,要么都回滚。因此扁平事务是应用程序成为原子操作的基本组成模块。

ssdssd注:扁平事务虽然简单,但在实际生产环境中使用最为频繁。正因为其简单,使用频繁,故每个数据库系统都实现了对扁平事务的支持。扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交。

dds带有保存点的扁平事务: 除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态。这是因为某些事务可能在执行过程中出现的错误并不会导致所有的操作都无效,放弃整个事务不合乎要求,开销也太大。保存点(Savepoint) 用来通知系统应该记住事务当前的状态,以便当之后发生错误时,事务能回到保存点当时的状态。

ssdssd注 1:对于扁平的事务来说,其隐式地设置了一个保存点。然而在整个事务中,只有这一个保存点,因此,回滚只能回滚到事务开始时的状态。保存点用SAVE WORK 函数来建立,通知系统记录当前的处理状态。当出现问题时,保存点能用作内部的重启动点,根据应用逻辑,决定是回到最近一个保存点还是其他更早的保存点。
在这里插入图片描述
ssdssd注 2:保存点在事务内部是递增的,这意味着 ROLLBACK 不影响保存点的计数,并且单调递增的编号能保持事务执行的整个历史过程,包括在执行过程中想法的改变。如果想要完全回滚事务,还需要再执行命令ROLLBACK WORK 。

dds链事务:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。注意,提交事务操作和开始下一个事务操作将合并为一个原子操作。这意味着下一个事务将看到上一个事务的结果,就好像在一个事务中进行的一样。
在这里插入图片描述
ssdssd注 1 : 可视为保存点模式的一种变种。带有保存点的扁平事务,当发生系统崩溃时,所有的保存点都将消失,因为其保存点是易失的(volatile),而非持久的(persistent) 。这意味着当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行。
ssdssd注 2 : 链事务与带有保存点的扁平事务不同的是,带有保存点的扁平事务能回滚到任意正确的保存点。而链事务中的回滚仅限于当前事务,即只能恢复到最近一个的保存点。对于锁的处理,两者也不相同。
ssdssd注 3 : 链事务在执行COMMIT 后即释放了当前事务所待有的锁,而带有保存点的扁平事务不影响迄今为止所持有的锁。

dds嵌套事务: 是一个层次结构框架。由一个顶层事务( topleveltransaction) 控制着各个层次的事务。顶层事务之下嵌套的事务被称为 子事务 (subtransaction), 其控制每一个局部的变换。
在这里插入图片描述
ssdssd注 1:嵌套事务是由若干事务组成的 一棵树,子树既可以是 嵌套事务,也可以是扁平事务处在叶节点的事务是扁平事务。但是每个子事务从根到叶节点的距离可以是不同的。位于根节点的事务称为 顶层事务,其他事务称为 子事务 。事务的前驱称 (predecessor) 为父事务(parent), 事务的下一层称为儿子事务(child) 。子事务既可以提交也可以回滚。但是它的提交操作并不马上生效,除非其父事务巳经提交。因此可以推论出,任何子事物都在顶层事务提交后才真正的提交树中的任意一个事务的回滚会引起它的所有子事务一同回滚,故子事务仅保留 A 、C 、I 特性,不具有D 的特性。

ssdssd注 2:实际的工作是交由叶子节点来完成的,即只有叶子节点的事务才能访问数据库、发送消息、获取其他类型的资源。而高层的事务仅负责逻辑控制,决定何时调用相关的子事务。即使一个系统不支持嵌套事务,用户也可以通过保存点技术来模拟嵌套事务。 如下图:在恢复时采用保存点技术比嵌套查询有更大的灵活性,如在完成Tk3 这事务时,可以回滚到保存点S2 的状态。而在嵌套查询的层次结构中,却不允许。
在这里插入图片描述
ssdssd嵌套事务的灵活性表现如下:

ssddsssd①、当通过保存点技术来模拟嵌套事务时,用户无法选择哪些锁需要被子事务继承,哪些需要被父事务保留。这就是说,无论有多少个保存点,所有被锁住的对象都可以被得到和访问。而在嵌套查询中,不同的子事务在数据库对象上持有的锁是不同的(说白了就是对于嵌套事务父事务的锁可以全部给它的子事务也可以就给其中的几个,如果子事务有父事务没有的锁,那么通过反向继承,也可以使父事务持有,而对于保存点技术模拟的嵌套事务是不能的选择哪些锁被优化的)。

ssddsssd②、如果系统支持在嵌套事务中并行地执行各个子事务,在这种情况下,采用保存点的扁平事务来模拟嵌套事务就不切实际了。这从另一个方面反映出,想要实现事务间的并行性, 需要真正支持的嵌套事务。

dds分布式事务:通常是一个在分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点(银行转账就是典型的分布式事务)。

ssdssd注:对于InnoDB 存储引擎来说,其支持扁平事务、带有保存点的事务、链事务、分布式事务。对于嵌套事务,其并不原生支持,因此,对有并行事务需求的用户来说,MySQL 数据库或InnoDB 存储引擎就显得无能为力了。然而用户仍可以通过带有保存点的事务来模拟串行的嵌套事务。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值