【问题标题】:Two quick question on transaction behaviour关于交易行为的两个快速问题
【发布时间】:2011-01-21 19:50:27
【问题描述】:

我的代码如下所示:

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 将其标记为“可释放”)。由于我在循环之后提交事务(变量在循环中被标记为可重复),这是否安全 - 我的意思是即使我已取消设置值来自的变量,数据也会安全地存储在数据库中吗?

【问题讨论】:

    标签: php database transactions


    【解决方案1】:

    由于只有最外层事务的结果从外部可见,嵌套事务本身意义不大,主要系统中只有 SQL Server 支持它们。

    SQL Server 中,中间回滚回滚到中间事务的开头,中间提交什么也不做。

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

    其他系统只有一个事务级别,可能有SAVEPOINTS 介于两者之间。您可以回滚到之前的每个保存点(通过提供它们的名称),但是发出没有保存名称点的 COMMITROLLBACK 始终会提交或回滚最外层的事务。

    【讨论】:

      【解决方案2】:

      回答问题2:

      • 将查询发送到数据库后,对 PHP 变量执行的操作就不再重要了
      • 你会做的唯一会产生影响的事情就是你何时commitrollback
      • 这意味着取消设置 PHP 变量不会影响数据库端的事务/数据。


      关于问题1:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 2020-02-11
        • 2010-12-12
        • 2011-07-25
        相关资源
        最近更新 更多