我将 PHP 与 PDO 和 InnoDB 表结合使用。
我只希望代码允许一个用户提交的操作完成,用户可以取消或完成。但是,如果用户发布了这两个操作,我希望其中一个请求失败并回滚,但现在并没有发生,两者都无异常/错误地完成。我认为在检查该行是否存在后将其删除就足够了。
$pdo = new PDO();
try {
$pdo->beginTransaction();
$rowCheck = $pdo->query("SELECT * FROM table WHERE id=99")->rowCount();
if ($rowCheck == 0)
throw new RuntimeException("Row isn't there");
$pdo->exec("DELETE FROM table WHERE id = 99");
// either cancel, which does one bunch of queries. if (isset($_POST['cancel'])) ...
// or complete, which does another bunch of queries. if (isset($_POST['complete'])) ...
// do a bunch of queries on other tables here...
$pdo->commit();
} catch (Exception $e) {
$pdo->rollback();
throw $e;
}
如何使取消/完成操作成为关键部分?第二个操作必须失败。
最佳答案
另一种解决方案的完整性:
private function getLock() {
$lock = $this->pdo->query("SELECT GET_LOCK('my_lock_name', 5)")->fetchColumn();
if ($lock != "1")
throw new RuntimeException("Lock was not gained: " . $lock);
}
private function releaseLock() {
$releaseLock = $this->pdo->query("SELECT RELEASE_LOCK('my_lock_name')")->fetchColumn();
if ($releaseLock != "1")
throw new RuntimeException("Lock not properly released " . $releaseLock);
}
关于PHP/MySQL 临界区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226922/