如果受影响的行为0,则PDO回滚

时间:2017-11-20 16:58:46

标签: php mysql pdo

我创建了一个PDO Database类来管理与db,query和transactions的连接。我想在一个事务中执行所有查询,所以如果一个抛出错误,其他的就会回滚。

首先我创建要运行的更新,删除或插入语句,并使用函数添加查询。

public function addQuery($entity)
    {
        $this->stack[] = $entity;
    }

然后我提交数组中的所有查询:

public function commit()
    {
        self::beginTransaction();

        try {

            foreach ($this->stack as $entity) {
                $entity->execute();
            }
            self::commitTransaction();
            return true;        
        } catch (Exception $e) {
            self::rollbackTransaction();
            return false;
        }
}

这是我使用的功能:

protected function beginTransaction()
{
  $this->dbo->beginTransaction();
}


protected function commitTransaction()
{
  $this->dbo->commit();
}

protected function rollbackTransaction()
{
  $this->dbo->rollBack();
}

我尝试过两次更新。将更新一行的第一个,第二个将影响0行。但我的功能不会回滚第一次更新。

1 个答案:

答案 0 :(得分:-1)

在您的代码中,您使用catch (Exception $e)捕获错误,然后执行回滚。

如果要考虑影响0行的SQL语句,则可以执行以下操作:

public function commit()
{
    self::beginTransaction();

    try {

        foreach ($this->stack as $entity) {
            $entity->execute();

            # If the statement affected 0 rows, then throw an error
            #   that will trigger a rollback
            if ( $entity->rowCount() == 0 ) {
               throw new \Exception("0 rows affected.");
            }
        }
        self::commitTransaction();
        return true;        
    } catch (Exception $e) {
        self::rollbackTransaction();
        return false;
    }
}

警告这可能会产生非常意外的后果,因为某些语句(如SELECT)会影响0行,然后会触发ROLLBACK。

希望这有帮助!