我创建了一个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行。但我的功能不会回滚第一次更新。
答案 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。
希望这有帮助!