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

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

我遇到了一个奇怪的问题

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

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

最佳答案

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

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

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

关于mysql - zend 适配器 beginTransaction() 和 commit() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6067614/

相关文章:

mysql - 如何从一组复合行中找到最大值?

php - zend 表单验证

php - 如何避免 Zend_Navigation 膨胀?

mySQL存储过程where子句问题

mysql - 条件分组 sql 查询

php - mysqli_fetch_row() 访问sql数据库中的特定行

zend-framework - 从 zend3 更新到 PHP 8.1 后的 Laminas 缓存配置问题

sql-server - 判断事务是否有未提交的更新

spring - Grails:有时会忽略Spring的@Transactional批注

php - 使用数据库事务防止竞争条件 (Laravel)