我正面临一个奇怪的问题
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();
}
答案 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();
}