我不太了解如何在dbal中进行事务处理
下面的脚本将根据行的id更新列。我放置了一个表中不存在的假id(因此无法进行更新),但是第一次更新是提交的,尽管它是一个事务。如果其中一个失败了,我希望所有的交易都会失败。

 $conn -> beginTransaction();
   try{
       $try = $conn->prepare("update table set column = '123' where id = 0"); //column exists
       $try->execute();
       $try = $conn->prepare("update table set column = '123' where id = 1"); //column exists
       $try->execute();
       $try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists
       $try->execute();

       $try = $conn->commit();
   }
   catch(Exception $e) {
       $try = $conn->rollback();
       throw $e;
   }

预期结果,由于id=120的行不存在,因此没有更新
实际结果是,除了不存在的行之外,所有行都将更新。
我预先道歉,但面向对象编程对我来说仍然是南极洲。

最佳答案

我知道这个问题已经很老了,所以如果将来有人遇到类似的问题,我会稍微解释一下,因为这种行为不是错误。

$try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists
$try->execute();

在这里,更新条件引用一个不存在的列,因此查询不会失败,它将更新0(零)行;在docine中,受影响的行数由execute()方法返回。
您可以抛出一个执行命令来触发回滚。
$try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists
$affected = $try->execute();
if ($affected == 0) {
  throw new Exception('Update failed');
}

关于php - Doctrine DBAL Transactions,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6798613/

10-11 01:39