事务是数据库系统不同于文件系统的很大一点,事务可以保证对于数据的修改,要么全部成功,要么全部回滚。
InnoDB中的事务完全符合ACID的特性。
认识事务
概论
事务是由一条或多条SQL语句组成的,最小的数据库程序执行单元。
关于ACID的定义在此略去不表。
分类
事务可以分为以下五类:
- 扁平事务
- 带有保存点的扁平事务
- 链事务
- 嵌套事务
- 分布式事务
扁平事务是最简单的一种事务,所有的操作都处于同一层次。扁平事务由Work开始,Commit/Roolback结束,要么全部成功,要么全部回滚。
扁平事务的主要限制在于无法提交或者回滚事务的某一部分。因此引出了带有保存点的扁平事务。
带有保存点的扁平事务,顾名思义,就是带有保存点的扁平事务,保存点可以作为回滚/提交的位置。回滚事务时,可以回滚到某一保存点,这样就不必全部回滚。保存点在事务内部是递增的。
扁平事务相当于只在起始位置设置了一个保存点的带有保存点的扁平事务。
链事务是为了解决保存点易失性而存在的,链事务就是多个事务组成链状,进而形成的一个链事务。链事务会在上一个节点事务提交后,隐式地,原子地开启下一个节点事务。
有点需要说明,链事务只能回滚到最近的节点事务;链事务会在当前节点事务提交后释放当前事务所持有的锁,而保存点事务则可以一直保留直到全部完成提交。
嵌套事务是由一个顶层事务控制分支逻辑完成的事务,它的组织形式像一棵树,叶子结点是一个扁平事务,执行实际的数据操作,根节点称为顶层事务,控制子节点,非叶子结点的子节点仅代表操作逻辑,不进行数据操作,同时也可以控制子节点的锁持有等资源。
也可以通过保存点来模拟嵌套事务。
分布式事务用来在分布式环境下运行扁平事务。分布式事务一样要满足ACID特性,只要整个环境中某一个扁平事务失败了,全部都要进行回滚。此外,为了保证一致性,分布式事务通常使用串行操作。
事务的实现
事务隔离性通过锁实现,事务的原子性,一致性和持久性通过redo log和undo log来实现。
redo恢复事务提交修改的页操作,undo回滚行记录到某个特定版本。redo是物理日志,undo是逻辑日志。