4.1.0中文参考手册---6.7MySQL事务与锁定命令

MySQL4.1.0 中文参考手册---犬犬(心帆)翻译 MySQLReferenceManualforversion4.1.0-alpha.

6.7 MySQL 事务与 锁定命令6.7.1BEGIN/COMMIT/ROLLBACK句法


缺省的, MySQL运行在autocommit模式。这就意味着,当你执行完一个更新时, MySQL将立刻将更新存储到磁盘上。

如果你使用 事务表(例如InnoDB、BDB),通过下面的命令,你可以设置 MySQL为非autocommit模式:

SETAUTOCOMMIT=0

在此之后,你必须使用COMMIT来存储你的更改到磁盘上,或者使用ROLLBACK,如果你希望忽略从你的 事务开始所做的更改。

如果你希望为一系列语句从AUTOCOMMIT模式转换,你可以使用STARTTRANSACTION或BEGIN或BEGINWORK语句:

STARTTRANSACTION;SELECT@A:=SUM(salary)FROMtable1WHEREtype=1;UPDATEtable2SETsummmary=@AWHEREtype=1;COMMIT;

STARTTRANSACTION在 MySQL4.0.11中被加入;这是被推荐的开始一个特别(ad-hoc) 事务的方式,因为这是ANSISQL句法。

注意,如果你使用的是一个非 事务安全表,更改会立刻被存储,不受autocommit模式状态的约束。

当你更新了一个非 事务表后,如果你执行一个ROLLBACK,你将得到一个错误(ER_WARNING_NOT_COMPLETE_ROLLBACK)作为一个警告。所有 事务安全表将被恢复,但是非 事务安全表将不会改变。

如果你使用STARTTRANSACTION或SETAUTOCOMMIT=0,你应该使用 MySQL二进制日志做备份以代替老的更新日志。 事务处理被以一个大块形式存储在二进制日志中,在COMMIT上面,为了保护回滚的 事务,而不是被存储的。查看章节4.9.4二进制日志。如果您使用起动 事务处理或集AUTOCOMMIT=0,您应该使用 MySQL二进制日志为备份代替更旧的更新日志。 事务处理存储在二进制登录一大块,做,保证,滚的 事务处理不存储。参见部分4。9.4二进制日志。

下列命令自动的结束一个 事务(就好像你在执行这个命令之前,做了一个COMMIT):
命令命令命令ALTERTABLEBEGINCREATEINDEXDROPDATABASEDROPTABLERENAMETABLETRUNCATE  
你可以使用SETTRANSACTIONISOLATIONLEVEL...改变 事务的隔离级。查看章节6.7.3SETTRANSACTION句法。
6.7.2LOCKTABLES/UNLOCKTABLES句法


LOCKTABLEStbl_name[ASalias]{READ[LOCAL]|[LOW_PRIORITY]WRITE}[,tbl_name[ASalias]{READ[LOCAL]|[LOW_PRIORITY]WRITE}...]...UNLOCKTABLES

LOCKTABLES为当前线程锁定表。UNLOCKTABLES释放当前线程拥有的所有锁定。当线程发出另一个LOCKTABLES,或当与服务器的连接被关闭时,被当前线程锁定的所有表将被自动地解锁。

为了在 MySQL4.0.2使用LOCKTABLES,你必须拥有一个全局的LOCKTABLES权限和一个在相关表上的SELECT权限。在 MySQL3.23中,你对该表需要有SELECT、insert、DELETE和UPDATE权限。

使用LOCKTABLES的主要原因是,仿效 事务处理或在更新表时得到更快的速度。此后会有更详细的描述。

如果一个线程在一个表上得到一个READ锁,该线程(和所有其它线程)只能从表中读取。如果一个线程在一个表上得到一个WRITE锁,那么只有拥有这个锁的线程可以从表中读取和写表。其它的线程被阻塞。

READLOCAL和READ之间的不同就在于,当锁被加载时,READLOCAL允许非冲突(non-conflicting)INSERT语句执行。如果当你加载着锁时从 MySQL外部操作文件,这将仍不能被使用。

当你使用LOCKTABLES是地,你必须锁定所有你将使用的表,并且必须使用与你的查询中将使用的别名相同!如果你在一个查询中多次使用一个表(用别名),你必须为每一个别名获得一个锁。

WRITE锁通过比READ锁有更高的权限,以确保更新被尽快地处理。这就意味着,如果一个线程获得一个READ锁,而同时另外一个线程请求一个WRITE锁,并发的READ锁请求将等待直到WRITE线程得到了锁并释放了它。你可以使用LOW_PRIORITYWRITE锁,当该线程在等待WRITE锁时,它将允许其它的线程获得READ锁。你应该只使用LOW_PRIORITYWRITE锁,如果你确信这将是最后一次,当没有线程将拥有READ锁。共3页  第1页  

你可能感兴趣的:(数据库)