MySQ事务概述

  一、认识事务  

    1.1、概述

  事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。事务时访问并更新数据库中各种数据项的一个程序执行单位。在事务的操作,要么都做修改,要么都不做,这就是事务的目的,也是事务模型区别与文件系统的重要特征之一。

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

  C(Consistency),一致性:一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

  I(Isolation),隔离性:事务额隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见。

  D(Durability),持久性:事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据回复。值得注意的是,只能从事务本身的角度来保证结果的永久性。

    1.2、分类

  •   扁平事务 (Flat Transactions)
  •   带有保存点的扁平事务 (Flat Transactions with Savepoints)
  •   链事务 (Chained Transactions)
  •   嵌套事务 (Nested Transactions)
  •   分布式事务 (Distributed Transactions)

     扁平事务  (Flat Transaction)是事务类型中最简单的一种。但是在实际生产环境中,这可能是使用最为频繁的事务。在扁平事务中,所有操作都处于同一层次,其由BEGIN WORK 开始,由COMMIT WORK 或 ROLLBACK WORK结束,其间的操作是原子的,要么都执行,要么都回滚。

     扁平事务虽然简单,但是在实际生产环境中使用最为频繁。正因为其简单,使用频繁,故每个数据库系统都实现了对扁平事务的支持。

  扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交。因此就出现了带有保存点的扁平事务。

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

  对于扁平的事务来说,其隐式地设置了一个保存点。然而在整个事务中,只有这一个保存点,因此,回滚只能回滚到事务开始的状态。保存点用SAVE WORK函数来建立,通知系统记录当前的处理状态。当出现问题时,保存点能用作内部的重启动点,根据应用逻辑,决定是回到最近一个保存点还是其他更早的保存点。

     链事务(Chained Transaction)可视为保存点模式的一种变种。带有保存点的扁平事务,当发生系统奔崩溃时,所有的保存点都将消失,因为其保存点是易失的(volatile)而非持久的(persistent)。这意味着当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行。

  链事务的思想是:在提交一个事务时,释放不需要的数据对象,将必要的处理上下问隐式传给下一个要开始的事务。注意,提交事务操作和开始下一个事务操作将合并为一个原子操作。这意味着下个事务将看到上一个事务的结果,就好像在一个事务中进行一样。

  

     嵌套事务 (Nested Transaction) 是一个层次机构框架。由一个顶层事务(top-level transaction) 控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务(subtransaction) , 其控制每一个局部的变换。

   嵌套事务的定义:

    1.嵌套事务是由若干事务组成的一棵树,子树既可以是嵌套事务,也可以是扁平事务

    2.处在叶节点的事务是扁平事务。但是每个子事务从根到叶节点的距离可以是不同的

    3.位于根节点的事务称为顶层事务,其他事务称为子事务。事务的前驱称为父事务,事务的下一层称为儿子事务

    4.子事务既可以提交也可以回滚。但是它的提交操作并不马上生效,除非其父事务已经提交,因此可以推论出,任何子事务都在顶层事务提交后才真正的提交

    5.树中的任意一个事务的回滚会引起它的所有子事务一同回滚,故子事务仅保留A、C、I 特性,不具有D的特性 

  实际的工作是交由叶子节点来完成的,即只有叶子节点的事务才能访问数据库、发送消息、获取其他类型的资源。而高层的事务仅负责逻辑控制,决定何时调用相关的子事务。即使一个系统不支持嵌套事务,用户也可以通过保存点技术来模拟嵌套事务。

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

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

  二、事务的实现

    2.1、redo

    2.2、undo

    2.3、purge

    2.4、group commit

  三、事务控制语句

  四、隐式提交的SQL语句

  五、对于事务操作的统计

  六、事务的隔离级别

  七、分布式事务

    7.1、MySQL数据库分布式事务

    7.2、内部XA事务

  八、不好的事务习惯

    8.1、在循环中提交

    8.2、使用自动提交

    8.3、使用自动回滚

  九、长事务

原文地址:https://www.cnblogs.com/huan30/p/12315218.html