原则 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 交易的主要内容,如果未能解决你的问题,请参考以下文章

读书笔记:交易型系统设计的一些原则

FXCG纪律管理之平仓原则及如何设置止损

区块链交易所系统开发源码,交易所搭建app

电商网站交易记录设计

数据中台实战:交易分析

量化交易机器人系统开发(现成)