<人力资源>
6.7 MySQL事务与锁定命令
6.7.1 <代码>开始/提交/回滚代码>句法
缺省的,MySQL运行在<代码>自动提交代码>模式。这就意味着,当你执行完一个更新时,MySQL将立刻将更新存储到磁盘上。
如果你使用事务安全表(例如<代码> Innodb 代码>,<代码> BDB> 代码),通过下面的命令,你可以设置MySQL为非自动提交<代码> 代码>模式:
设置自动提交=0
>之前在此之后,你必须使用<代码>提交> 代码来存储你的更改到磁盘上,或者使用<代码>回滚代码> ,如果你希望忽略从你的事务开始所做的更改。
如果你希望为一系列语句从<代码>自动提交代码>模式转换,你可以使用<代码>开始事务代码>或<代码>开始代码>或<代码>开始工作> 代码语句:
开始交易;选择@A:=SUM(工资)从表1类型=1;更新表设置summmary=@A类型=1;提交;
<代码>开始事务> 代码在MySQL 4.0.11中被加入;这是被推荐的开始一个特别(特别的)事务的方式,因为这是ANSI SQL句法。
注意,如果你使用的是一个非事务安全表,更改会立刻被存储,不受<代码>自动提交代码>模式状态的约束。
当你更新了一个非事务表后,如果你执行一个<代码>滚> 代码,你将得到一个错误(<代码> ER_WARNING_NOT_COMPLETE_ROLLBACK> 代码)作为一个警告。所有事务安全表将被恢复,但是非事务安全表将不会改变。
如果你使用<代码>开始事务代码>或<代码>设置自动提交=0> 代码,你应该使用MySQL二进制日志做备份以代替老的更新日志。事务处理被以一个大块形式存储在二进制日志中,在<代码>提交代码>上面,为了保护回滚的事务,而不是被存储的。查看章节4.9.4二进制日志。如果您使用起动事务处理或集AUTOCOMMIT=0,您应该使用MySQL二进制日志为备份代替更旧的更新日志。事务处理存储在二进制登录一大块,做,保证,滚的事务处理不存储。参见部分4 .9.4二进制日志。
下列命令自动的结束一个事务(就好像你在执行这个命令之前,做了一个<代码>提交> 代码):
<>强命令强> <>强命令强> <>强命令强> <代码> ALTER TABLE 代码> <代码> 代码> <代码>开始创建指数代码> <代码>删除数据库代码> <代码> DROP TABLE 代码> <代码> 代码> <代码>截断重命名表> 代码,,你可以使用<代码>设置事务隔离级别……> 代码改变事务的隔离级。查看章节6.7.3 <代码>设置事务> 代码句法。
6.7.2 <代码> 代码>句表锁定/解锁表法
锁表tbl_name[作为别名]{(本地)|阅读(LOW_PRIORITY)写}[,tbl_name[作为别名]{(本地)|阅读(LOW_PRIORITY)写}…)……打开表
<代码> 代码>为锁表当前线程锁定表。代码> <代码>解锁表释放当前线程拥有的所有锁定。当线程发出另一个<代码> 代码>锁定表,或当与服务器的连接被关闭时,被当前线程锁定的所有表将被自动地解锁。
为了在MySQL 4.0.2使用<代码> 代码>锁定表,你必须拥有一个全局的<代码> 代码>锁表权限和一个在相关表上的<代码> 代码>选择权限。在MySQL 3.23中,你对该表需要有<代码>选择代码>,<代码>插入代码>,<代码>删除代码>和<代码> 代码>更新权限。
使用<代码> 代码>锁表的主要原因是,仿效事务处理或在更新表时得到更快的速度。此后会有更详细的描述。
如果一个线程在一个表上得到一个<代码> 代码>读锁,该线程(和所有其它线程)只能从表中读取。如果一个线程在一个表上得到一个<代码> 代码>写锁,那么只有拥有这个锁的线程可以从表中读取和写表。其它的线程被阻塞。
<代码>读当地的代码>和<代码>读代码>之间的不同就在于,当锁被加载时,<代码>读当地的代码>允许非冲突(无)
MySQL 4.1.0中文参考手册——6.7 MySQL事务与锁定命令(转)