PHP/MySQL 临界区

标签 php mysql transactions innodb critical-section

我将 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);
}

MySQL GET_LOCK() documentation

关于PHP/MySQL 临界区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226922/

相关文章:

php - 警告:DOMDocument::loadHTML(): htmlParseEntityRef:在实体中期望 ';',

php - Symfony 5 - 黑豹 : invalid cookie domain

使用多列/键的 MySQL JOIN 3 表

MySQL显示菜单包括父菜单

MySQL 隔离级别,测量它们对死锁的影响

php - php pdo 内存不足

php - 执行方法始终设置为 true

java - 无法配置数据源 : 'url' attribute is not specified and no embedded datasource could be configured. SPRING

Spring,休眠与谷歌应用引擎

Android:SQLite (ORMLite) 事务隔离级别