6.2现状

现在,对于访问事务表或使用二进制日志的每个语句,都会启动一个语句事务。如果语句成功,则提交语句事务。如果语句失败,则回滚事务。语句事务的提交不是持久的——每个语句事务都嵌套在正常事务中,如果回滚正常事务,则所有所包含的语句事务的影响也将被撤消。从技术上讲,一个语句事务可以被视为一个事务,它以MySQL自动维护的保存点开始,以便使一个语句的效果原子化。

正常的事务由用户启动,通常也由用户请求完成。正常事务包含在开始和结束之间发出的所有语句事务。在自动提交模式下,正常事务相当于语句事务。

由于MySQL支持可插拔存储引擎架构(PSEA),因此可以同时激活多个事务引擎。所以从服务器的角度来看,事务总是分布式的。特别地,MySQL为每个引擎独立地维护事务状态。为了提交事务,MySQL采用了两阶段提交协议。

并非所有语句都在事务上下文中执行。管理和状态信息语句不会修改引擎数据,因此它们不会启动语句事务,也不会影响正常事务。这类语句的例子有SHOW STATUS和RESET SLAVE。

类似地,DDL语句不是事务性的,因此DDL语句(几乎)从不启动事务。但是DDL语句和管理语句之间有一个区别:DDL语句总是在继续之前提交当前事务(如果有的话);行政声明没有。

最后,使用非事务性引擎的SQL语句对连接的事务状态也没有影响。尽管它们导致写入二进制日志(二进制日志基本上是事务性的),但它们以“透写”模式直接写入binlog文件,然后执行操作系统缓存同步——换句话说,它们绕过binlog撤销日志(translog)。它们不提交当前的正常事务。使用非事务性表的语句的失败将导致语句事务的回滚,但如果没有使用非事务性表,这是无关紧要的,因为没有启动语句事务。