关于交易行为的两个快速问题

时间:2010-02-27 16:31:24

标签: php database transactions

我的代码如下:

function foobar(array& $objects, $con = null)
{
   if (is_null($con))
      $con = DbSingleton::getConnectio();

   $con->beginTransaction();  // <- question 1

   try
   {
     foreach($objects as $object)
     {
        // allocate memory for new object 
        $new_obj = new MyShiningNewObject();

        // do something to the new object ...
        $new_obj->setParentId($object->getId());
        $new_obj->save($con);

        // mark for garbage collection
        unset($new_obj);  // <- question 2
      }

     $con->commit();
  }
  catch(Exception $e){ $con->rollBack(); }      
}

我的问题是:

  1. 我开始一个交易,这很可能是一个嵌套的交易。在嵌套事务的情况下,如果抛出异常并且我回滚,则回滚到达最远的位置(到最外面的事务) - 常识表明应该是这种情况,但是人们永远不知道。

  2. 我正在释放内存(好吧,Zend GC标记为“可用”)。由于我在循环之后提交事务,(变量在循环中被标记为可擦除),这是否安全 - 我的意思是数据是否安全地存储在数据库中,即使我已取消设置值来自的变量?

2 个答案:

答案 0 :(得分:2)

由于只有最外层交易的结果可以从外部看到,因此嵌套交易几乎没有意义,只有主要系统只有SQL Server支持它们。

SQL Server中,中间回滚回滚到中间事务的开头,中间提交不执行任何操作。

最外面的回滚回滚整个最外层的事务(即使中间有提交),最外面的提交会提交整个最外层的事务。

其他系统只有一个事务级别,其间可能有SAVEPOINTS。您可以回滚到以前的每个保存点(通过提供其名称),但是在没有savename点的情况下发出COMMITROLLBACK始终会提交或回滚最外面的保存点。

答案 1 :(得分:1)

回答问题2:

  • 一旦将查询发送到数据库,对PHP变量所做的事情就不再重要了
  • 您唯一能做的就是commitrollback
  • 表示取消设置PHP变量不会对数据库端的事务/数据产生影响。


关于问题1: