【问题标题】:How to lock an SQL row with PDO如何使用 PDO 锁定 SQL 行
【发布时间】:2017-05-25 15:59:37
【问题描述】:

我试图锁定表中的一行仅用于更新,同时允许读取,但以下代码并未锁定该行。我通过 POST 请求在不提交 code1 的情况下执行了“code1”,然后执行了“code2”。因此,这些代码中的每一个都位于一个不同的 .php 文件中。

我也尝试过使用“SELECT ... FOR UPDATE”,但这也没有用。

代码1:

try{
    $pdo->beginTransaction();
    $sql = "SELECT assertedFlags FROM statementcontent WHERE id = $statementId LOCK IN SHARE MODE;";
    $statement = $pdo->query($sql);
    var_dump($statement->fetchAll());
}catch(Exception $e){
    $pdo->rollBack();
    exit('Exception ' . $e->getMessage());
}

代码2:

try{
    $pdo->beginTransaction();
    $sql = "SELECT assertedFlags FROM statementcontent WHERE id = $statementId LOCK IN SHARE MODE;";
    $statement = $pdo->query($sql);
    var_dump($statement->fetchAll());

    //New segment starts here:

    $sql = "UPDATE statementcontent SET assertedFlags = '4' WHERE id = $statementId;";
    $statement = $pdo->exec($sql);
    var_dump($statement);
    $pdo->commit();
}catch(Exception $e){
    $pdo->rollBack();
    exit('Exception ' . $e->getMessage());
}

会不会是因为code1退出后锁被释放而没有被锁定?

编辑

我把两个pdo实例放在一个文件中,这一次锁起作用了。我真的不明白服务器在有很多请求时如何管理查询。会有很多进程还是很多线程?它会在所有情况下保持锁定还是仅在多个线程的情况下保持锁定? 谢谢。

【问题讨论】:

  • 当然没有锁,因为code1退出后锁就被释放了

标签: php sql pdo transactions locking


【解决方案1】:

对于正确的行锁定,您应该查看:

https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html

但是这要求你的数据库表是 innodb 而不是 myisam。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2020-04-17
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多