即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

MySQL事务处理

编程语言 dancheren 76℃ 0评论
本文目录
[隐藏]

1. START TRANSACTIONCOMMITROLLBACK语法

START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}

以下语句提供事务的使用控制:

  • START TRANSACTIONBEGIN语句可以开始一项新的事务。
  • COMMIT可以提交当前事务,使其永久更改。
  • ROLLBACK可以回滚当前事务,取消变更。
  • SET AUTOCOMMIT语句可以禁用或启用当前连接中默认的autocommit模式,。

默认情况下,MySQL采用autocommit模式运行。这意味着,当您执行一个用于更新(修改)表的语句之后,MySQL立刻把更新存储到磁盘中。

如果您正在使用一个事务安全型的存储引擎(如InnoDBBDBNDB簇),则您可以使用以下语句禁用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 TRANSACTIONautocommit仍然被禁用,直到您使用COMMITROLLBACK结束事务为止。然后autocommit模式恢复到原来的状态。

BEGINBEGIN
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更改事务的隔离等级。

2. SAVEPOINTROLLBACK
TO SAVEPOINT
语法

SAVEPOINT identifier
ROLLBACK [WORK] TO SAVEPOINT identifier
RELEASE SAVEPOINT identifier

InnoDB支持SQL语句SAVEPOINT,
ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT
和可选的用于ROLLBACKWORK关键词。

SAVEPOINT语句用于用标识符名称设置命名一个事务保存点。如果当前事务有一个同样名称的保存点,则旧的保存点被删除,新的保存点就会被设置。

ROLLBACK TO SAVEPOINT语句会向以命名的保存点回滚一个事务。如果在保存点被设置后,当前事务对行进行了更改,则这些更改会在回滚中被撤销。但是,InnoDB不会释放被存储在保存点之后的存储器中的行锁定。(注意,对于新插入的行,锁定信息被存储在行中的事务ID承载;锁定没有被分开存储在存储器中。在这种情况下,行锁定在撤销中被释放。)在被命名的保存点之后设置的保存点被删除。

如果语句返回以下错误,则意味着不存在带有指定名称的保存点:

ERROR 1181: Got error 153 during ROLLBACK

RELEASE SAVEPOINT语句会从当前事务的一组保存点中删除已命名的保存点,不出现提交或回滚。如果保存点不存在,会出现错误。

如果您执行COMMIT或执行不能命名保存点的ROLLBACK,则当前事务的所有保存点被删除。

3. LOCK TABLESUNLOCK
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

4. SET TRANSACTION语法

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

本语句用于设置事务隔离等级,用于下一个事务或者当前会话。

在默认情况下,SET TRANSACTION会为下一个(还未开始)事务设置隔离等级。如果您使用GLOBAL关键词,则语句会设置全局性的默认事务等级,用于从该点以后创建的所有新连接,且原有的连接不受影响。要进行此操作,您需要SUPER权限。使用SESSION关键词可以设置默认事务等级,用于对当前连接执行所有将来事务。

5.   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 STARTJOINRESUME子句不被支持。

对于XA ENDSUSPEND
[FOR MIGRATE]
子句不被支持。

每个XA语句以XA关键词为开头,多数语句要求一个xid值。xidXA事务的标识符,它指示该语句适用于哪个事务。xid值由客户端提供,或由MySQL服务器生成。xid值包含一到三个部分:

xid: gtrid [, bqual [, formatID ]]

gtrid是一个全局事务标识符,bqual是一个分支限定符,formatID是一个用于标识由gtridbqual值使用的格式的数字。根据语法,bqualformatID是可选的。如果没有给定,默认的bqual值是'',默认的fromatID值是1

gtridbqual必须为字符串文字,每个的长度最多为64字节(不是字符)。gtridbqual可以用多种方法指定。您可以使用带引号的字符串('ab'),十六进制字符串(0x6162,
X'ab')
,或位值(b'nnnn')

formatID是一个无符号的整数。

转载请注明:CodingBlog » MySQL事务处理

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情