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

Php 如果受影响的行为0,则PDO回滚,php,mysql,pdo,Php,Mysql,Pdo,我创建了一个PDO数据库类来管理与数据库、查询和事务的连接。我希望在一个事务中执行所有查询,因此如果一个事务抛出错误,其他事务将回滚 首先,我创建要运行的update、delete或insert语句,并使用函数添加查询 public function addQuery($entity) { $this->stack[] = $entity; } 然后我提交数组中的所有查询: public function commit() { se

我创建了一个PDO数据库类来管理与数据库、查询和事务的连接。我希望在一个事务中执行所有查询,因此如果一个事务抛出错误,其他事务将回滚

首先,我创建要运行的update、delete或insert语句,并使用函数添加查询

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行。但是我的函数不会回滚firs更新。

在您的代码中,您使用
catch(异常$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行,然后会触发回滚


希望这有帮助

有0个受影响的行不是错误,在这种情况下如何回滚?