官网地址:MySQL :: MySQL 5.7 Reference Manual :: 13.3.1 START TRANSACTION, COMMIT, and ROLLBACK Statements
欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.
START TRANSACTION
[transaction_characteristic [, transaction_characteristic] ...]
transaction_characteristic: {
WITH CONSISTENT SNAPSHOT
| READ WRITE
| READ ONLY
}
BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1}
这些声明对使用 交易 :
START TRANSACTION
或 BEGIN
开始新的交易。
COMMIT
执行当前的事务,使其变化永久化。
ROLLBACK
滚动回当前事务,取消其更改。
SET autocommit
禁用或启用当前会话的默认自动提交模式。
在默认情况下,mysql运行的是 自动提交 启动模式。这意味着,当一个事务中没有其他内容时,每个语句都是原子的,就好像它被一个START TRANSACTION
和COMMIT
.你不能用ROLLBACK
撤销效果;但是,如果在语句执行期间发生错误,语句将被回滚。
若要对单个系列语句隐式禁用自动提交模式,请使用START TRANSACTION
声明:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
与…有关START TRANSACTION
,自动提交仍然无效,直到您结束与 COMMIT
或ROLLBACK
.然后,自动提交模式恢复到以前的状态。
START TRANSACTION
允许几个控制事务特性的修饰符。若要指定多个修饰符,请用逗号分隔它们。
…WITH CONSISTENT SNAPSHOT
修饰器启动A 一致读为 存储引擎的能力。这只适用于InnoDB
.其效果与发出START TRANSACTION
接下来是SELECT 任何人 InnoDB
表看 第14.7.2.3节,"一致的非锁读" .…WITH CONSISTENT SNAPSHOT
修饰符不改变当前事务 隔离水平 因此,只有当当前的隔离级别允许一致读取时,它才提供一致的快照。唯一允许一致阅读的隔离级别是 REPEATABLE READ .所有其他隔离级别,WITH CONSISTENT SNAPSHOT
条款被忽略。截至mysql5.7.2,当WITH CONSISTENT SNAPSHOT
条款被忽略。
…READ WRITE
和READ ONLY
修饰符设置事务访问模式.它们允许或禁止对事务中使用的表进行更改。…READ ONLY
限制防止事务修改或锁定其他事务可见的事务表和非事务表;事务仍然可以修改或锁定临时表。
Mysql对查询启用了额外的优化 InnoDB
当事务已知为只读时的表。指定的READ ONLY
确保在无法自动确定只读状态的情况下应用这些优化。看 8.5.3节,"优化Innodb只读交易" 获取更多信息。
如果没有指定访问模式,则适用默认模式。除非更改了默认值,否则它是读写的。不允许规定两者READ WRITE
和READ ONLY
在同一份声明中。
在只读模式下,仍然可以更改使用TEMPORARY
使用DML语句的关键词。不允许对DDL语句进行更改,就像对永久表一样。
有关事务访问模式的其他信息,包括更改默认模式的方式,请参阅 第13.3.6节,"设定交易报表" .
如果read_only 启用系统变量,显式地启动事务 START TRANSACTION READ WRITE
需要 SUPER 特权。
许多用于编写mysql客户端应用程序(如JDBC)的API提供了自己的启动事务的方法,这些方法可以(有时应该)使用,而不是发送一个 START TRANSACTION
客户的证词。看 Chapter 27, 连接器和API ,或为您的API提供文档,以获取更多信息。
若要显式禁用自动提交模式,请使用以下语句:
SET autocommit=0;
在通过设置 autocommit 变量为零,事务安全表的变化(例如 InnoDB 或 NDB 并不是马上就成为永久性的。你必须使用COMMIT 存储您对磁盘或ROLLBACK
忽略这些变化。
autocommit 是一个会话变量,必须为每个会话设置。若要禁用每个新连接的自动提交模式,请参阅 autocommit 系统变量在 第5.1.7节,"服务器系统变量" .
BEGIN
和BEGIN WORK
作为别名提供支持。START TRANSACTION
启动交易。START TRANSACTION
是标准的SQL语法,是启动临时事务的推荐方式,允许修改者BEGIN
不会。
…BEGIN
声明不同于使用 BEGIN
关键词开始 BEGIN ... END 复合陈述。后者并不启动交易。看 第13.6.1节,"开始。..最后复合语句" .
在所有存储程序(存储过程和函数、触发器和事件)中,解析器处理BEGIN [WORK]
作为一个 BEGIN ... END 整块。在这个上下文中开始一个事务 START TRANSACTION 相反。
可选择的WORK
支持关键词 COMMIT
和ROLLBACK
,正如CHAIN
和RELEASE
条款。CHAIN
和RELEASE
可用于额外控制事务完成.它的价值completion_type 系统变量决定默认的完成行为.看 第5.1.7节,"服务器系统变量" .
…AND CHAIN
条款导致新事务在当前事务结束后立即开始,新事务与刚刚终止的事务具有相同的隔离级别。新交易亦采用相同的存取方式(READ WRITE
或READ ONLY
作为刚刚终止的交易。…RELEASE
此条款导致服务器在终止当前事务后断开当前客户端会话。包括 NO
关键词压制CHAIN
或RELEASE
完成,如果completion_type 系统变量设置为默认情况下导致链接或释放完成.
启动事务将导致提交任何挂起的事务.看 第13.3.3节,"造成默示犯罪的声明" ,详情请参阅。
启动事务也会导致表锁 LOCK TABLES 准备释放,就像 UNLOCK TABLES .启动事务不会释放通过FLUSH TABLES WITH READ LOCK .
为了取得最佳结果,事务应该只使用由单个事务安全存储引擎管理的表来执行。否则,可能会出现下列问题:
如果您使用的表来自多个事务安全存储引擎(例如:InnoDB
),而事务隔离级别并非 SERIALIZABLE ,当一个事务提交时,使用相同表的另一个正在进行的事务可能只看到第一个事务所做的一些更改。也就是说,事务的原子性不能用混合的引擎来保证,并且可能会导致不一致。(如果混合引擎事务很少,你可以使用 SET TRANSACTION ISOLATION LEVEL 把隔离级别设置到SERIALIZABLE 必要时按每笔交易计算。)
如果在事务中使用不具有事务安全性的表,则无论自动提交模式的状态如何,对这些表的更改都将立即存储。
如果你发行 ROLLBACK 在更新事务中的非事务表后的声明, ER_WARNING_NOT_COMPLETE_ROLLBACK 会有警告发生。对事务安全表的更改是回滚的,而不是对非事务安全表的更改。
每个事务都存储在一个数据块的二进制日志中。 COMMIT .回滚的事务没有记录。( 例外情况 :不能回滚对非事务表的修改。如果回滚的事务包括对非事务表的修改,则整个事务将使用 ROLLBACK 结束时的语句,以确保复制对非事务表的修改。)见 第5.4.4节,"二进制日志" .
您可以更改与SET TRANSACTION 声明。看 第13.3.6节,"设定交易报表" .
回滚可以是一个缓慢的操作,它可以在没有用户明确要求的情况下隐式地发生(例如,发生错误时)。因为这个,SHOW PROCESSLIST 显示Rolling back
在…中State
会议栏,不仅仅是使用 ROLLBACK 语句也用于隐式回滚。
In MySQL 5.7,BEGIN
, COMMIT
,以及ROLLBACK
不会受到--replicate-do-db 或--replicate-ignore-db 规则。
何时InnoDB
执行事务的完全回滚,事务设置的所有锁都被释放.如果事务中的单个SQL语句由于错误(例如重复键错误)而回滚,则在事务保持活动时保留语句设置的锁。出现这种情况是因为InnoDB
存储行锁的格式使其无法知道哪个锁是由哪个语句设置的。
如果SELECT 事务中的语句调用存储函数,而存储函数中的语句失败,该语句回滚。如果 ROLLBACK 随后为事务执行,整个事务回滚。