一、什么是事务
1.事务(Transaction)是区别于数据库文件系统的重要特性之一。事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时,可以确保要么所有修改都已经保存,要么所有修改都不保存。
2.InnoDB存储引擎中的事物完全符合ACID的特性。
-
原子性(atomicity)
-
一致性(consistency)
-
隔离性(isolation)
-
持久性(duration)
3.事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都做修改,要么都不做,这就是事物的目的。
二、ACID的具体描述
4.具体介绍事物的ACID特性:
-
Atomicity:原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。
-
Consistency:一致性指将事务从数据库从一种状态转变为下一种一致状态。在事务开始之前和结束以后,数据库的完整性约束没有被破坏。【实体完整性(Primary key/Unique)、参照完整性(Foreign Key)、域完整性(Not Null /check)、用户自定义完整性(Trigger/Assertion】
-
Isolation:(别名:并发控制(concurrency control)、可串行化(serializability)、锁(locking))事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见。
-
Durability:事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。只能从事务本身的角度来保证结果的永久性。【持久性保证的是事务系统的高可靠性(High Reliability),而不是高可用性(High Availability)。
三、事务的分类
-
扁平事务(Flat Transactions)
-
带有保存点的扁平事务(Flat Transaction with Savapoints)
-
链事务(Chained Transactions)
-
嵌套事务(Nested Transactions)
-
分布式事务(Distributed Transactions)
扁平事务:是事务类型中最简单的一种,但实际生产环境中,这可能是使用最频繁的事物。主要限制:不能提交或者回滚事务的某一部分,或分几个步骤提交。
【注:带有保存点的扁平事务,当发生系统崩溃时,所有的保存点都将消失,因为其保存点是易失的(volatile),而非持久的(persistent)。这意味着当进行数据恢复时,需要从开始处重新执行,而不能从最近的一个保存点继续开始。】
带有保存点的事务:除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态。【保存点Savepoint:用来通知系统应该记住事务当前的状态,以便当发生错误时,事务能回到保存点当时的状态。保存点能用作内部的重启动点,根据应用逻辑,决定是回到最近一个保存点还是其他更早的保存点。】
链事务:可视为保存点模式的一个变种。在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。【提交事务操作和开始下一个事务操作将合并为一个原子操作。】
【注:带有保存点的扁平事务能回滚到任意正确的保存节点,且不影响迄今为止的所有锁;而链事务中的回滚仅限于当前事务,即只能恢复到最近一个的保存点,且在执行COMMIT后即释放了当前事务所持有的锁。】
嵌套事务:是一个层次框架。有一个顶层事务(Top-level transation)控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务(subtransaction),其控制每一个局部的变换。【任何子事务都在顶层事务提交后才真正提交】
分布式事务:通常是一个在分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点。
推荐一本书:《MySQL技术内幕InnoDB存储引擎》姜承尧(著)
上述图片来自:https://github.com/asdbex1078/MySQL