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