14 事务控制和锁定语句
MySQL支持的锁定 :
a.表级锁定 : MyISAM 和 MEMORY
b.页级锁定 : BDB
c.行级锁定 : InnoDB
默认情况下,表锁和行锁都是自动获得的,不需要额外命令.
有些情况下,用户需要明确地进行锁表或者进行事务的控制,确保事务的完整性.
1.LOCK TABLES 和 UNLOCK TABLES
LOCK TABLES 可以用于当前线程的表.如果表被其他线程锁定,当前线程会等待.
UNLOCK TBALES 可以释放当前线程获得的任何锁定.当线程执行另一个LOCK TABLES 或与服务器的连接关闭时,当前线程之前锁定的表被隐含的解锁.
LOCK TABLES
tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
[,tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY WRITE}]
...
UNLOCK TABLES
2.事务控制
MySQL通过 SET AUTOCOMMIT , 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}
默认情况,MySQL是 AUTOCOMMIT ,
如果需要通过明确的 COMMIT 和 ROLLBACK来提交/回滚 事务, 那么需要通过明确的事务控制命令来开始事务(不同于ORACLE).
START TRANSACTION 或 BEGIN 语句来开始一项新的事务.
COMMIT , ROLLBACK 用来提交或回滚事务.
CHAIN 和 RELEASE子句 分别用来定义在事务提交或者回滚之后的操作.
CHAIN 会立即启动一个新事务,并且和刚才的事务具有相同的隔离级别.
RELEASE 则会断开和客户端的连接.
SET AUTOCOMMIT 可以修改当前连接的提交方式. 该值为0时 , 后面所有的事务都需要通过明确的命令进行提交/回滚.
如果只是对某些语句需要进行事务控制,则使用START TRANSACTION 语句开始一个事务比较方便,这样事务结束后可以自动回到自动提交的方式;
如果希望所有的事务都不是自动提交的,那么通过修改AUTOCOMMIT来控制事务比较方便,这样不用在每个事务开始的时候再执行 START TRANSACTION 语句.
在锁表期间,如果使用START TRANSACTION 开始一个新的事务,会造成一个隐含的UNLOCK TABLES 被执行.
另外,对LOCK 语句显示加的表锁 , 用ROLLBACK不起作用.
在同一事务中,最好不使用不同引擎的表,否则 ROLLBACK时,需要对非事务类型的表进行特别处理,因为 COMMIT/ROLLBACk 只能对事务类型的表进行提交和回滚.
与Oracle相同,所有的DDL语句是不能回滚,并且部分的DDL语句会造成隐式的提交.
在事务中可以通过定义SAVEPOINT 指定ROLLBACK事务的一部分,但不能指定COMMIT事务的一部分.
在复杂的应用中可以定义多个不同的SAVEPOINT ,满足不同的条件时,ROLLBACK 不同的SAVEPOINT .
需要注意,定义了相同名字的SAVEPOINT,后面定义的会覆盖之前定义的.
对于不再使用的SAVEPOINT , 可以通过RELEASE SAVEPOINT命令删除SAVEPOINT , 之后不能再执行 ROLLBACK TO SAVEPOINT 命令.
分布式事务的使用
在MySQL中,使用分布式的应用程序涉及一个或多个资源管理器和一个事务管理器.
资源管理器(RM) : 用于提供通向事务资源的途径.数据库服务器就是一种资源管理器.该管理器必须可以COMMIT/ROLLBACK由RM管理的事务.
事务管理器(TM) : 用于协调作为一个分布式事务一部分的事务.TM与管理每个事务的RMs进行通讯.一个分布式事务中各个单个事务军事分布式事务的"分支事务".分布式事务和个分支通过一种命名方法进行标识.
todooooooooooo ...