事务
事务简介
特性(ACID)
- 原子性(Atomicity):指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库状态应该退回事务前的状态。
- 一致性(Consistency):指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。
- 隔离性(Isolation):事务的隔离性要求每个读写事务的对象对其他事务的操作对象能互相分离,即该事务提交前对其他事务都不可见,通常使用锁来实现。
- 持久性(Durability):事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。
分类
扁平事务
- 是事务中最简单的一种,但在实际生产环境中可能是使用最为频繁的事务。在扁平事务,所有操作都处于同一层次,其由
begin work
开始,由commit work
或rollback work
结束,其间的操作是原子的,要么都执行,要么都回滚。
带保存点的扁平事务
- 除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态。这是因为某些事务可能在执行过程中出现错误并不会导致所有的操作都无效,放弃整个事务不合乎要求,开销也太大。
- 保存点用来通知系统应该记住事务当前的状态,以便之后发生错误时,事务能够回到保存点当时的状态。
- 保存点在事务内部是递增的,不会因为回滚而出现覆盖。
- 保存点是易失的,即当发生系统崩溃后进行恢复时,事务需要从开始处重新执行,不能从最近的一个保存点继续。
链事务
- 在提交一个事务时,释放不需要的数据对象,将必要的上下文隐式地传给下一个要开始的事务。提交事务的操作和开始下一个事务的操作将合并为一个原子操作,这意味着下一个事务将看到上一个事务的结果。
- 链事务与带保存点的事务不同的是,带保存点的扁平事务能回滚到任意正确的保存点,而链事务中的回滚仅限于当前事务。此外,链事务在执行
commit
后即释放了当前事务所持有的锁,而带保存点的扁平事务不影响迄今为止所持有的锁。
嵌套事务
- 是一个层次结构框架,由一个顶层事务控制各个层次的事务。顶层事务之下嵌套的事务称为子事务,其控制每一个局部变换。
分布式事务
- 通常是一个在分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点。
事务的实现
- redo log用来保证事务的持久性,undo log用来保证事务的一致性。
- redo通常是物理日志,记录的是页的物理修改操作,用于对页进行重做操作。undo是逻辑日志,根据每行记录进行记录,用于对事务进行回滚。
- 当事务提交时,必须先将该事务的所有日志写入到redo日志文件进行持久化,待事务的提交成功后才算完成。
- undo存放在数据库内部的一个特殊段中,称为undo段,位于共享表空间内。
事务的隔离级别
- 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。
- 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。
- 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读。
- 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
原文链接
分布式事务
- XA是一种分布式事务的标准,多数数据库都实现了XA接口。
- XA事务由一个或多个资源管理器、一个事务管理器以及一个应用程序组成。
- 资源管理器:提供访问事务资源的方法。通常一个数据库就是一个资源管理器。
- 事务管理器:协调参与全局事务中的各个事务。需要和参与全局事务的所有资源管理器进行通信。
- 应用程序:定义事务的边界,指定全局事务中的操作。
- 分布式事务使用两段式提交。在第一阶段,所有参与全局事务的节点都开始准备,告诉事务管理器它们准备好提交了。在第二阶段,事务管理器告诉资源管理器执行
rollback
还是commit
。如果任何一个节点显示不能提交,在所有节点都被告知需要回滚。
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.