【发布时间】: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