10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载 从本手册中摘录

MySQL 5.7参考手册/....../ 启动事务,提交和回滚语句

13.3.1启动事务、提交和回滚语句

开始事务(transaction_characteristic[,transaction_characteristic]…]transaction_characteristic:{用一致的快照|读写|只读}开始[工作]提交[工作] [和[否]链] [[否]释放]回滚[工作] [和[否]链[[否]释放]设置autocommit = {0 |1}

这些语句提供了对使用的控制交易:

  • 开始事务开始开始新的交易。

  • 犯罪提交当前事务,使其更改永久性。

  • 回滚回滚当前事务,取消其更改。

  • 设置自动提交禁用或启用当前会话的默认自动提交模式。

默认情况下,MySQL运行autocommit模式启用。这意味着,当事务中没有其他情况时,每个语句都是原子的,就像它被包围一样开始事务犯罪。你不能使用回滚撤消效果;但是,如果在语句执行期间发生错误,则会回滚语句。

若要隐式地禁用单个系列语句的自动提交模式,请使用开始事务陈述:

开始交易;从表1中选择@a:= sum(薪水),其中type = 1;更新表2设置摘要= @ A类型= 1;犯罪;

开始事务,AutoCommit仍然禁用,直到您结束交易犯罪回滚。然后,自动提交模式恢复到之前的状态。

开始事务允许控制事务特征的几个修饰符。若要指定多个修饰符,请用逗号分隔。

  • 与一致的快照修饰符开始一致阅读存储引擎的能力。这只适用于InnoDB。其效果与发出a开始事务紧随其后的是一个选择从任何InnoDB表格看到第14.7.2.3节,“一致的非锁定读取”。的与一致的快照修饰符不会更改当前事务隔离级别,因此,仅当当前隔离级别是允许一致读取的时,才提供一致的快照。允许一致读取的唯一隔离级别是可重复读取。对于所有其他隔离级别,请使用与一致的快照条款将被忽略。从MySQL 5.7.2开始,当与一致的快照条款将被忽略。

  • 读写只读修饰符设置事务访问模式。它们允许或禁止对交易中使用的表格的更改。的只读限制防止事务修改或锁定对其他事务可见的事务性和非事务性表;事务仍然可以修改或锁定临时表。

    MySQL支持对查询进行额外的优化InnoDB当事务已知为只读时的表。指定只读确保在不能自动确定只读状态的情况下应用这些优化。看到第8.5.3节,“优化InnoDB只读事务”想要查询更多的信息。

    如果未指定访问模式,则默认模式适用。除非默认更改,否则它是读/写的。不允许指定两者读写只读在同一声明中。

    在只读模式下,仍然可以更改使用暂时的关键字使用DML语句。不允许对DDL语句进行更改,就像对永久表一样。

    有关事务访问模式的其他信息,包括更改默认模式的方法,请参阅章节13.3.6,“SET TRANSACTION Statement”

    如果read_only启用系统变量,显式地启动事务启动事务读写需要这一点极好的特权。

重要的

许多用于编写MySQL客户机应用程序(如JDBC)的api提供了它们自己的方法来启动事务,可以(有时应该)使用这些方法而不是发送开始事务来自客户端的声明。看到27章,连接器和api或者有关更多信息,10bet官方网站或API的文档。

要显式禁用自动提交模式,请使用以下语句:

设置autocommit = 0;

禁用自动提交模式后设置autocommit变量为0时,对事务安全表的更改(例如InnoDBNDB)不是立即使永久性的。你必须使用犯罪将更改存储到磁盘或回滚忽略更改。

autocommit是一个会话变量,必须为每个会话设置。要禁用每个新连接的自动提交模式,请参见autocommit系统变量第5.1.7节,“服务器系统变量”

开始开始工作被支持作为别名开始事务启动交易。开始事务是标准SQL语法,是启动Ad-hoc事务的推荐方式,并允许修饰符开始才不是。

开始声明与使用不同开始关键字,以开始......结束复合语句。后者不会开始一个事务。看到第13.6.1节,“开始…复合语句”

请注意

在所有存储的程序中(存储过程和函数,触发器和事件),解析器对待开始[工作]作为一个开始......结束块。在此上下文中使用开始事务代替。

可选工作支持以下关键字犯罪回滚,正如释放条款。释放可用于对事务完成的额外控制。的价值completion_type.系统变量确定默认完成行为。看到第5.1.7节,“服务器系统变量”

和链子句会在当前事务结束后立即启动新事务,并且新事务具有与刚刚终止的事务相同的隔离级别。新事务也使用相同的访问模式(读写只读)作为刚刚终止的事务。的释放子句导致服务器在终止当前事务后断开当前客户端会话。包括没有关键字抑制释放完成,如果completion_type.系统变量设置为默认情况下会导致链接或释放完成。

开始一个事务会导致任何挂起的事务被提交。看到第13.3.3节“导致隐含提交的陈述”,以获取更多信息。

开始交易也会导致使用的表锁锁表被释放,好像你已经执行了打开表。开始一个事务并不释放用用读锁冲洗表

为了获得最佳结果,事务应该只使用由单个事务安全存储引擎管理的表来执行。否则,可能会出现以下问题:

  • 如果使用来自多个事务安全存储引擎(例如InnoDB),而事务隔离级别不是可序列化的,有可能当一个事务提交时,使用相同表的另一个正在进行的事务只看到第一个事务所做的一些更改。也就是说,使用混合引擎无法保证事务的原子性,可能会导致不一致。(如果混合引擎事务不常见,可以使用设置事务隔离级别将隔离级别设置为可序列化的在每个事务的基础上(如有必要)。

  • 如果在事务中使用非事务安全的表,则对这些表的更改将立即存储,而不考虑自动提交模式的状态。

  • 如果你签发回滚语句更新事务内的非事务性表后,则ER_WARNING_NOT_COMPLETE_ROLLBACK警告发生。对事务安全表的更改会回滚,但对非事务安全表的更改不会回滚。

每个事务都存储在一个块中的二进制日志中犯罪。回滚的事务未记录。(例外:对非讲台的修改无法回滚。如果回滚的事务包括对非讲台的修改,则整个事务被记录使用回滚语句,以确保复制对非事务性表的修改。)看到第5.4.4节,“二进制日志”

属性更改事务的隔离级别或访问模式设置交易声明。看到章节13.3.6,“SET TRANSACTION Statement”

滚动可以是慢速操作,可能在没有明确要求它的情况下隐式发生(例如,当发生错误时)。因为这,显示PROCESSLIST显示滚回来在里面状态会话列,不仅用于使用的显式回滚回滚语句,但也用于隐式回滚。

请注意

在mysql 5.7中,开始,犯罪,回滚不受——replicate-do-db——replicate-ignore-db规则。

什么时候InnoDB执行事务的完全回滚,交易设置的所有锁都会发布。如果事务中的单个SQL语句作为错误卷起,例如重复密钥错误,则在事务保持活动时保留语句设置的锁定。这发生了,因为InnoDB以一种格式存储行锁,这样它就不能知道哪个语句设置了哪个锁。

如果一个选择事务中的语句调用存储的函数,并且存储函数中的语句失败,该语句回滚。如果回滚随后为事务执行,整个事务回滚。