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