zend适配器beginTransaction()和commit()失败

时间:2011-05-20 04:54:43

标签: mysql zend-framework transactions zend-db referential-integrity

我正面临一个奇怪的问题

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();
    }   

1 个答案:

答案 0 :(得分:9)

TRUNCATE TABLE将导致implicit commit结束当前交易。

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应该是事务保存(but slower

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

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