【问题标题】:php PDO lock tablesphp PDO 锁表
【发布时间】: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 工作,情况就不会如此 :)
  • 您的用户是否有锁定表的权限?
  • 是的,也检查过!

标签: php mysql pdo


【解决方案1】:

你的语法有点不对劲。在每个表名后添加WRITE

$db -> exec('LOCK TABLES `table1` WRITE, `table2` WRITE');

【讨论】:

    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2020-02-08
    • 2020-04-17
    • 2018-06-13
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多