2

我面臨的一個奇怪的問題Zend的適配器的BeginTransaction()和commit()失敗

的Zend_Db_Adapter會的beginTrasaction()和commit()方法似乎並沒有被工作正常。我在beginTrasaction()和commit()方法中包含了INSERT語句(在FOR LOOP中)。但即使發生像下面這樣的錯誤,我仍然可以看到已經插入了一些行,但我期望在發生錯誤後不再發生提交。我無法理解爲什麼。有人可以幫忙嗎?謝謝。

SQLSTATE [23000]:完整性約束違規:1062重複條目 '0' 等鍵 '主要'

代碼塊:

 **$localDB->beginTransaction();** 
    try{ 
     echo $localDB->isConnected(); 

     $localDB->query("TRUNCATE TABLE $this->dbTable"); 
     **foreach ($rowSet as $row){** 
      foreach ($row as $key=>$value){ 
       $localRow[$this->columnMap[$key]] =$value; 
      } 
      **$localDB->insert($this->dbTable,$localRow);** 

     } 

     $localDB->commit(); 
     } 
     catch (Exception $e){ 
     $localDB->rollBack(); 
     echo $e->getMessage(); 
    } 
+0

我覺得你有正試圖進入相同值的主鍵。在這種情況下,請給出表格詳細信息以及columnMap的來源。它是否包含任何值? – 2011-05-20 06:33:50

+0

我認爲他的主要問題是交易未按預期工作。 – 2011-05-20 06:53:04

回答

8

TRUNCATE TABLE將導致implicit commit至極將結束目前的交易。

1)在beginTransaction()之前放TRUNCATE TABLE

$localDB->query("TRUNCATE TABLE $this->dbTable"); 
$localDB->beginTransaction(); 
try { 
    ... 

    $localDB->commit(); 
} catch (Exception $e){ 
    $localDB->rollBack(); 
    echo $e->getMessage(); 
} 

2)DELETE FROM應該是交易的save(but slower

$localDB->beginTransaction(); 
try { 
    $localDB->query("DELETE FROM $this->dbTable"); 
    ... 

    $localDB->commit(); 
} catch (Exception $e){ 
    $localDB->rollBack(); 
    echo $e->getMessage(); 
} 
+0

太棒了!謝謝 。很有幫助。 – krishna 2011-05-21 22:28:18

相關問題