开始事务(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”。
许多用于编写MySQL客户机应用程序(如JDBC)的api提供了它们自己的方法来启动事务,可以(有时应该)使用这些方法而不是发送开始事务
来自客户端的声明。看到27章,连接器和api或者有关更多信息,10bet官方网站或API的文档。
要显式禁用自动提交模式,请使用以下语句:
设置autocommit = 0;
禁用自动提交模式后设置autocommit
变量为0时,对事务安全表的更改(例如InnoDB
或NDB
)不是立即使永久性的。你必须使用犯罪
将更改存储到磁盘或回滚
忽略更改。
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
以一种格式存储行锁,这样它就不能知道哪个语句设置了哪个锁。