PDO和多个查询/并发问题


PDO and Multiple Query / Concurrency Issues

在PHP中,我使用PDO与数据库交互。通常发生的一个过程包括多个查询(几个SELECT和UPDATE)。这在大多数情况下都有效,但偶尔在过程的两个(或多个)实例同时运行时,数据会损坏。

解决这个问题的最佳方法是什么?理想情况下,我想要一个能与大多数PDO驱动程序配合使用的解决方案。

假设您的数据库后端支持事务(mysql与InnoDB、Postgres等),那么只需将有问题的操作封装在事务中即可解决问题。如果当第二个脚本尝试启动该脚本时,该脚本的一个实例处于事务的中间,则第二个剧本的数据库更改将排队,直到第一个事务完成才尝试。这意味着,只要事务启动和提交逻辑正确实现,数据库将始终处于有效状态。

if ($inTransaction = $pdo -> beginTransaction ())
{
    // Do your selects and updates here. Try to keep this section as short as possible though, as you don't want to keep other pending transactions waiting
    if ($condition_for_success_met)
    {
        $pdo -> commit ();
    }
    else
    {
        $pdo -> rollback ();
    }
}
else
{
    // Couldn't start a transaction. Handle error here
}