START TRANSACTION
,COMMIT
和ROLLBACK
语法START TRANSACTION | 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
语句可以禁用或启用当前连接中默认的autocommit
模式,。 默认情况下,MySQL采用autocommit
模式运行。这意味着,当您执行一个用于更新(修改)表的语句之后,MySQL立刻把更新存储到磁盘中。
如果您正在使用一个事务安全型的存储引擎(如InnoDB
,BDB
或NDB
簇),则您可以使用以下语句禁用autocommit
模式:
SET AUTOCOMMIT=0;
通过把AUTOCOMMIT
变量设置为零,禁用autocommit
模式之后,您必须使用COMMIT
把变更存储到磁盘中,或者如果您想要忽略从事务开始进行以来做出的变更,请使用ROLLBACK
。
如果您想要对于一个单一系列的语句禁用autocommit
模式,则您可以使用START TRANSACTION
语句:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
使用START TRANSACTION
,autocommit
仍然被禁用,直到您使用COMMIT
或ROLLBACK
结束事务为止。然后autocommit
模式恢复到原来的状态。
BEGIN
和BEGIN WORK
被作为START TRANSACTION
的别名受到支持,用于对事务进行初始化。START TRANSACTION
是标准的SQL语法,并且是启动一个ad-hoc
事务的推荐方法。BEGIN
语句与BEGIN
关键词的使用不同。BEGIN
关键词可以启动一个BEGIN...END
复合语句。后者不会开始一项事务。
您也可以按照如下方法开始一项事务:
START TRANSACTION WITH CONSISTENT SNAPSHOT;
WITH CONSISTENT SNAPSHOT
子句用于启动一个一致的读取,用于具有此类功能的存储引擎。目前,该子句只适用于InnoDB
,该子句的效果与发布一个START TRANSACTION
,后面跟一个来自任何InnoDB
表的SELECT
的效果一样。
开始一项事务会造成一个隐含的UNLOCK TABLES
被执行。
为了获得最好的结果,事务应只使用由单一事务存储引擎管理的表执行。否则,会出现以下问题:
如果您使用的表来自多个事务安全型存储引擎(例如InnoDB
),并且事务隔离等级不是SERIALIZABLE
,则有可能当一个事务提交时,其它正在进行中的、使用同样的表的事务将只会发生由第一个事务产生的变更。也就是,用混合引擎不能保证事务的原子性,并会造成不一致。(如果混合引擎事务不经常有,则您可以根据需要使用SET TRANSACTION ISOLATION LEVEL
把隔离等级设置到SERIALIZABLE
。)
如果您在事务中使用非事务安全型表,则对这些表的任何变更被立刻存储,不论autocommit
模式的状态如何。
如果您在更新了事务中一个事务表之后,发布一个ROLLBACK
语句,则会出现一个ER_WARNING_NOT_COMPLETE_ROLLBACK
警告。对事务安全型表的变更会被回滚,但是非事务安全型表没有发生任何改变。
每个事务被存储在一个组块中的二进制日志中,在COMMIT
之上。其中被回滚的事务不被计入日志。(例外情况:对非事务表的更改不会被回滚。如果一个被回滚的事务包括对非事务表的更改,则整个事务使用一个ROLLBACK
语句计入日志末端,以确保对这些表的更改进行复制。)
您可以使用SET TRANSACTION ISOLATION LEVEL
更改事务的隔离等级。
SAVEPOINT
和ROLLBACK TO SAVEPOINT
语法SAVEPOINT identifier
ROLLBACK [WORK] TO SAVEPOINT identifier
RELEASE SAVEPOINT identifier
InnoDB
支持SQL语句SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT
和可选的用于ROLLBACK
的WORK
关键词。
SAVEPOINT
语句用于用标识符名称设置命名一个事务保存点。如果当前事务有一个同样名称的保存点,则旧的保存点被删除,新的保存点就会被设置。
ROLLBACK TO SAVEPOINT
语句会向以命名的保存点回滚一个事务。如果在保存点被设置后,当前事务对行进行了更改,则这些更改会在回滚中被撤销。但是,InnoDB
不会释放被存储在保存点之后的存储器中的行锁定。(注意,对于新插入的行,锁定信息被存储在行中的事务ID
承载;锁定没有被分开存储在存储器中。在这种情况下,行锁定在撤销中被释放。)在被命名的保存点之后设置的保存点被删除。
如果语句返回以下错误,则意味着不存在带有指定名称的保存点:
ERROR 1181: Got error 153 during ROLLBACK
RELEASE SAVEPOINT
语句会从当前事务的一组保存点中删除已命名的保存点,不出现提交或回滚。如果保存点不存在,会出现错误。
如果您执行COMMIT
或执行不能命名保存点的ROLLBACK
,则当前事务的所有保存点被删除。
LOCK TABLES
和UNLOCK TABLES
语法LOCK TABLES
tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...
LOCK TABLES
可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获取所有锁定为止。UNLOCK TABLES
可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES
时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁。
表锁定只用于防止其它客户端进行不正当地读取和写入。保持锁定(即使是读取锁定)的客户端可以进行表层级的操作,比如DROP TABLE
。
SET TRANSACTION
语法SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
本语句用于设置事务隔离等级,用于下一个事务或者当前会话。
在默认情况下,SET TRANSACTION
会为下一个(还未开始)事务设置隔离等级。如果您使用GLOBAL
关键词,则语句会设置全局性的默认事务等级,用于从该点以后创建的所有新连接,且原有的连接不受影响。要进行此操作,您需要SUPER
权限。使用SESSION
关键词可以设置默认事务等级,用于对当前连接执行所有将来事务。
XA
事务SQL语法 要在MySQL中执行XA
事务,应使用以下语句:
XA {START|BEGIN} xid [JOIN|RESUME]
XA END xid [SUSPEND [FOR MIGRATE]]
XA PREPARE xid
XA COMMIT xid [ONE PHASE]
XA ROLLBACK xid
XA RECOVER
对于XA START
,JOIN
和RESUME
子句不被支持。
对于XA END
,SUSPEND [FOR MIGRATE]
子句不被支持。
每个XA
语句以XA
关键词为开头,多数语句要求一个xid
值。xid
是XA
事务的标识符,它指示该语句适用于哪个事务。xid
值由客户端提供,或由MySQL服务器生成。xid
值包含一到三个部分:
xid: gtrid [, bqual [, formatID ]]
gtrid
是一个全局事务标识符,bqual
是一个分支限定符,formatID
是一个用于标识由gtrid
和bqual
值使用的格式的数字。根据语法,bqual
和formatID
是可选的。如果没有给定,默认的bqual
值是''
,默认的fromatID
值是1
。
gtrid
和bqual
必须为字符串文字,每个的长度最多为64字节(不是字符)。gtrid
和bqual
可以用多种方法指定。您可以使用带引号的字符串('ab')
,十六进制字符串(0x6162, X'ab')
,或位值(b'nnnn')
。
formatID
是一个无符号的整数。