3

我面临一个奇怪的问题

Zend_DB_Adapter 的 beginTrasaction() 和 commit() 方法似乎没有按预期工作。我在 beginTrasaction() 和 commit() 方法中包含 INSERT 语句(在 FOR LOOP 中)。但是,即使发生如下错误,我仍然看到已经插入了一些行,而我希望由于发生错误而不会发生提交。我无法理解为什么。有人可以帮忙吗。谢谢。

SQLSTATE [23000]:违反完整性约束:1062 键 'PRIMARY' 的重复条目 '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();
    }   
4

1 回答 1

9

TRUNCATE TABLE将导致隐式提交将结束当前事务。

1)放在TRUNCATE TABLE前面beginTransaction()

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

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

2)DELETE FROM应该是事务保存(但速度较慢

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

    $localDB->commit();
} catch (Exception $e){
    $localDB->rollBack();
    echo $e->getMessage();
} 
于 2011-05-20T06:56:12.640 回答