原则 DBAL 交易
Posted
技术标签:
【中文标题】原则 DBAL 交易【英文标题】:Doctrine DBAL Transactions 【发布时间】:2011-10-11 12:48:54 【问题描述】:我不太明白如何在 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 的行不存在 真实结果,除不存在的行外,所有行都已更新。
我提前道歉,但面向对象编程对我来说仍然是南极洲。
【问题讨论】:
【参考方案1】:我知道这个问题已经很老了,所以如果有人在未来遇到类似的问题,我会稍微解释一下,因为这种行为不是错误。
$try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists
$try->execute();
这里更新条件引用了一个不存在的列,所以查询不会失败,它会更新0(零)行;在 Doctrine 中,受影响的行数由 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');
【讨论】:
【参考方案2】:此代码仅在抛出异常时回滚事务。
更新不成功时返回false
,而不是Exception。
您可以尝试无例外:
$try = $conn->commit();
if (!$try)
$conn->rollback();
或者当结果为false
时抛出异常。
【讨论】:
看起来像 $try = $conn->commit();不会把 $try 变成一个布尔值......似乎什么都没有发生?以上是关于原则 DBAL 交易的主要内容,如果未能解决你的问题,请参考以下文章