3

私は奇妙な問題に直面しています

Zend_DB_Adapter の beginTrasaction() メソッドと commit() メソッドが期待どおりに動作していないようです。beginTrasaction() および commit() メソッドで囲まれた (FOR LOOP 内の) INSERT ステートメントがあります。しかし、以下のようにエラーが発生した場合でも、エラーが発生したためコミットが行われないことを期待していましたが、すでにいくつかの行が挿入されていることがわかります。なぜなのか理解できません。誰か助けてくれませんか。ありがとう。

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が発生します。

TRUNCATE TABLE1) の前に置き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 に答える