2010-02-27 88 views
2

快速的問題,我有一些代碼,看起來像這樣:兩對交易行爲

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. 我begining交易,這很可能是一個嵌套事務。在嵌套事務的情況下,如果拋出異常並且我回滾,回滾到最後的事務有多遠 - 常識表明這應該是這種情況,但從來不知道。

  2. 我釋放了內存(ok,Zend GC標記爲'freeable')。因爲我在循環之後提交事務(該變量在循環中標記爲可變),這是否安全 - 我的意思是將數據安全地存儲在數據庫中,即使我沒有設置該值來自哪個變量?

回答

1

要回答的問題2:

  • 一旦查詢發送到數據庫,什麼是對的PHP變量所做不再重要
  • 你會做的唯一的事情將有一個影響是當你將commitrollback
  • 這意味着取消設置PHP變量將不會影響數據庫端的事務/數據。


關於問題1:

2

因爲只有結果從外部可以看到最外面的交易,嵌套交易ha沒有什麼意義,只有SQL Server支持他們。

SQL Server中,中間回滾回滾到中間事務的開始處,中間提交什麼也不做。

最外面的回滾會回滾整個最外層的事務(即使有中間的commit),最外層的commit會提交整個最外層的事務。

其他系統只有一個交易級別,其間可能有SAVEPOINTS。您可以回滾到以前的每個保存點(通過提供它們的名稱),但是在沒有savename點的情況下發出COMMITROLLBACK將始終提交或回退最外面的事務。