InnoDB 事务
事务把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时,可以确保要么所有修改都已保存了,要么所有修改都不保存。
ACID:原子性atomicity、一致性consistency、隔离性isolation、持久性durablity。
原子性指整个数据库事务是不可分割的工作单位。食物中的所有数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库状态应该退回到事务之前的状态。
一致性:指事务将数据库从一种状态转变为下一种一致的状态。事务前后,数据库的完整性约束没有被破坏。
隔离性:也称并发控制、可串行化、锁等。事物的隔离性要求每个读写事务的对象对其它事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,通常使用锁来完成。
持久性:事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。
事务分为以下几种类型:
扁平事务、带有保存点的扁平事务、链事务、嵌套事务、分布式事务。
扁平事务:所有操作处于同一层次。最简单的事务。
带有保存点的扁平事务:除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态。保存点用来通知系统应该记住事务当前的状态,以便当之后发生错误时,事务能回到保存点当时的状态。
链事务:可视为保存点模式的一种变种。带保存点的扁平事务,在发生系统崩溃时,所有的保存点都将消失,因为保存点是易失的而非持久的,当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行。
而链事务在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地床给下一个要开始的事务。提交事务操作和开始下一个事务操作将合并为一个原子操作,这意味着下一个事务将看到上一个事务的结果。链事务中的回滚仅限于当前事务,即只能恢复到最近一个保存点。
嵌套事务:是一个层次结构框架。由一个顶层事务控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务,其控制每一个局部的变换。
分布式事务:通常是在一个分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点。
事务的实现:
隔离性由锁来实现。原子性、一致性、持久性通过数据库的redo log和undo log来完成。redo log称为重做日志,用来保证事务的原子性和持久性。undo log用来保证事务的一致性。
redo:
重做日志,实现持久性。一是内存中重做日志缓冲,其是易失的;二是重做日志文件,其是持久的。
InnoDB在事务提交时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事物的COMMIT操作完成才算完成。redo log保证事务持久性,undo log用来帮助事务回滚及MVCC的功能。redo log基本是顺序写的,在数据库运行时不需要对redo log的文件进行读取操作。而undo log是需要进行随机读写的。
每次将重做日志写入重做日志文件后,InnoDB存储引擎都需要调用一次fsync操作
undo:
进行回滚操作。如果用户执行的事务或语句由于某种原因失败了,又或者用户用一条ROLLBACK语句请求回滚,就可以利用这些undo信息将数据回滚到修改之前的样子。
undo存放在数据库内部的一个特殊段中,这个段称为undo段。undo段位于共享表空间内。
purge:
purge用于最终完成delete和update操作。
group commit:
事务提交时会进行两个阶段的操作:
1)修改内存中事务对应的信息,并且将日志写入重做日志缓冲。
2)调用fsync将确保日志都从重做日志缓冲写入磁盘。
步骤2相比步骤1会慢很多。所以可以将多个事物的重做日志通过一次fsync刷新到磁盘,这样就大大减少了磁盘的压力,从而提高了数据库的整体性能。对于写入或更新较为频繁的操作,group commit的效果尤为明显。
事务处理:
START TRANSACTION;
COMMIT;
ROLLBACK;
SAVEPOINT identifier;
RELEASE SAVEPOINT identifier;
ROLLBACK TO identifier;
SET TRANSACTION; //设置事务的隔离级别。
InnoDB提供的隔离级别有:READ UNCOMMITTED; READ COMMITTED; REPEATABLE READ; SERIALIZABLE。
普通SQL语句隐式提交。事务使用COMMIT提交事务内的多条SQL语句。
事务的隔离级别:
读未提交:
读已提交;
可重复读:默认的隔离级别。
串行化:
分布式事务:
指允许多个独立的事务资源参与到一个全局的事务中。事务资源通常是关系型数据库系统,也可以是其它类型的资源。全局事务要求在其中的所有参与的事务要么都提交,要么都会滚。
在使用分布式事务时,InnoDB存储引擎的事务隔离级别必须设置为SERIALIZABLE。
XA事务支持多种不同的数据库服务器。
XA事务由一个或多个资源管理器、一个事务管理器以及一个应用程序组成。
资源管理器:提供访问事务资源的方法,通常一个数据库就是一个资源管理器。
事务管理器:协调参与全局事务中的各个事务,需要和参与全局事务的所有资源管理器进行通信。
应用程序:定义事务的边界,指定全局事务中的操作。
分布式事务使用两段式提交:一是所有参与全局事务的节点都开始准备(PREPARE),告诉事务管理器它们准备好提交了;二是事务管理器告诉资源管理器执行ROLLBACK还是COMMIT,如果任何一个节点显示不能提交,则所有的节点都被告知需要回滚。
长事务:执行时间较长的事务。