事务控制和锁定语句
LOCK TABLE和UNLOCK TABLE:
- 范例
1. SESSION1, 以READ锁表:
2. SESSION2此时依然可以执行读操作,若SESSION2若执行写操作会处于等待:
3. SESSION1释放锁,SESSION2的更新操作将被执行:
事务控制:
- 事务有关的语法
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用来提交或者回滚事务。
- CHAIN和RELEASE子句分别用来定义在事务提交或者回滚之后的操作,CHAIN会立即启动一个新事务,并且和刚才的事务具有相同的隔离级别,RELEASE则会断开和客户端的连接。
- SET AUTOCOMMIT可以修改当前连接的提交方式,如果设置SET AUTOCOMMIT=0,则设置之后的所有事务都需要通过明确的命令进行提交或回滚。
- 用START TRANSACTION会造成一个隐含的unlock tables执行。
- 可以通过SAVEPOINT <point_name>指定一个回滚点,然后ROLLBACK TO SAVEPOINT <point_name>可进行部分回滚。
分布式事务的使用:
- 仅InnoDB的表支持分布式事务。
分布式事务原理:
- MySQL分布式事务涉及一个或多个资源管理器和一个事务管理器:
1. 资源管理器(RM)用于提供通向事务资源的途径。数据库服务器是一种资源管理器。该管理器必须可以提交或回滚由RM管理的事务。例如,多台 MySQL数据库作为多台资源管理器或者几台MySQL服务器和几台Oracle服务器作为资源管理器。
2. 事务管理器(TM)用于协调作为一个分布式事务一部分的事务。TM与管理每个事务的RM进行通信。一个分布式事务中各个事务均是分布式事务 的“分支事务”。分布式事务和各分支通过一种命名方法进行标识。
- 执行分布式事务的过程使用两阶段提交:
1. 第一阶段:所有的分支被预备好。即它们被TM告知要准备提交。通常,这意味着用于管理分支的每个RM会记录对于被稳定保存的分支的行动。分支 指示是否它们可以这么做。这些结果被用于第二阶段。
2. 第二阶段:TM告知RMs是否要提交或回滚。如果在预备分支时,所有的分支指示它们将能够提交,则所有的分支被告知要提交。如果在预备时,由任 何分支指示它将不能提交,则所有分支被告知回滚。
分布式事务的语法:
- 分布式事务基本语法:
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 [CONVERT XID]
- 其中xid为一个XA事务标识符,用来唯一标识一个分布式事务,xid由客户端提供或由MySQL服务器生成。
- xid由三部分生成:
xid: gtrid [, bqual [, formatID ]]
gtrid:一个分布式事务标识符,相同分布式事务应该使用同一个gtrid;
bqual:分支事务标识符号,默认为空串;
formatID:一个数字,标识由gtrid和bqual值使用的格式,默认值为1。
- 范例
存在的问题:
- 如果分支事务在达到prepare状态时,数据库异常重新启动,服务器重新启动以后,可以继续对分支事务进行提交或回滚的操作,但是提交的事务没有写binlog,存在一定的隐患,可能导致使用binlog恢复丢失部分数据。如果存在复制的数据库,则有可能导致主从数据库的数据不一致。
具体详细可参考:
http://dev.mysql.com/doc/refman/5.7/en/dynindex-isolevel.html
不吝指正。