话说MySQL锁表

译者:叶金荣(Email:),来源:MySQL手册版本 5.0.1-alpha,转载请注明译者,并且不能用于商业用途,违者必究。

上周写程序时碰到一个问题,为了让数据保持一致性,就在读写数据前锁表,用PHP来处理的,没想到引发了新问题。锁完表之后,由于还需要用到其它数据表,然而,这时就有问题了,报错大致如下:ERROR 1100 (HY000): Table 'table1' was not locked with LOCK TABLES; 我调用的是PEAR::DB类,跟踪PHP程序老半天还是不得其解,就在脑子快想破了的时候,突然灵光一闪,于是就打开手册,开始找关于锁表的片段,终于找到了,原文片段如下:
When you use LOCK TABLES, you must lock all tables that you are going to use and you must use the same alias that you are going to use in your queries! If you are using a table multiple times in a query (with aliases), you must get a lock for each alias!
大致意思是,在锁某个表之后,该进程如果需要用到其它表,也必须锁定该表;这个问题是以前一直都没注意到的,用的也少,看手册也不够细心啊。。。

技术相关:

评论

也就是说把要用到的表都锁住才可以么?对吧?

是的,同时建议尽量缩短处理过程,避免长时间锁表

MySQL方案、培训、支持