Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关于交易行为的两个快速问题_Php_Database_Transactions - Fatal编程技术网

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

Php 关于交易行为的两个快速问题,php,database,transactions,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) { // allocat

我有如下代码:

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(); }      
}
函数foobar(数组&$objects,$con=null) { 如果(为空($con)) $con=DbSingleton::getConnectio(); $con->beginTransaction();//setParentId($object->getId()); $new_obj->save($con); //垃圾收集标志 unset($new_obj);//commit(); } catch(异常$e){$con->rollBack();} } 我的问题是:

  • 我正在开始一个事务,这很可能是一个嵌套事务。在嵌套事务的情况下,如果抛出异常并回滚,回滚会返回多远(到最外层的事务)-常识表明应该是这样,但人们永远不知道

  • 我正在释放内存(好的,Zend GC将其标记为“可释放”)。由于我在循环后提交事务(变量在循环中标记为frreable),这是否安全?我的意思是,即使我已取消设置值来自的变量,数据是否会安全地存储在db中


  • 回答问题2:

    • 一旦查询被发送到数据库,对PHP变量所做的事情就不再重要了
    • 只有当您
      提交
      回滚
      时,才会产生影响
    • 这意味着取消设置PHP变量不会影响数据库端的事务/数据

    关于问题1:

    • 如果您的数据库系统支持嵌套事务,那么在逻辑上,对“内部”事务的提交/回滚应该只对该“内部”事务起作用
    • 但请注意,并非所有DBMS都支持嵌套事务——例如,据我记忆所及,MySQL不支持嵌套事务
    • 作为参考,这里有三个关于嵌套引用的问题(可能还有更多问题):

    由于只有最外层事务的结果从外部可见,因此嵌套事务本身没有什么意义,只有SQL Server支持嵌套事务

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

    最外层回滚回滚整个最外层事务(即使其间有提交),最外层提交提交整个最外层事务

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