在这个脚本中我有:
$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
PDO连接的类。
这不应该是我理解的问题的原因,正是因为它们共享相同的连接。锁表语句应该由它们“继承”。
答案 0 :(得分:0)
你的语法有点偏。在每个表名后添加WRITE
:
$db -> exec('LOCK TABLES `table1` WRITE, `table2` WRITE');