【发布时间】:2013-06-30 18:25:12
【问题描述】:
在这个脚本中我有:
$db = new PDO('mysql:host=localhost; dbname=name; charset=utf8', 'user', 'pass');
$db -> exec('LOCK TABLES `table1`, `table2` WRITE');
// Do some stuff here
$db -> exec('UNLOCK TABLES');
问题是这些表似乎没有被锁定。脚本的多个实例同时执行。
// Do something here
代码仍然无法像 LOCK TABLES 语句所期望的那样以原子方式执行操作。
我做错了什么?
我还注意到,虽然我没有明确锁定我使用的其他表(例如table3),但我仍然可以读/写它们。根据 mySQL 手册,这应该是不可能的。
编辑:
// Do some stuff here 代码实例化了一些执行 DB 工作但共享相同 $db PDO 连接的类。
据我了解,这不应该是问题的原因,正是因为它们共享相同的连接。锁定表语句应该由它们“继承”。
【问题讨论】:
-
你怎么知道脚本同时执行了多次?
-
对于初学者来说,它被设计为同时执行多次。之后,我可以看到数据库中的数据是错误的 :) 如果没有执行脚本的多个实例并且 LOCK TABLES 工作,情况就不会如此 :)
-
您的用户是否有锁定表的权限?
-
是的,也检查过!