我不太了解如何在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/