Zend Adapter beginTransaction () и commit () завершаются ошибкой - PullRequest
3 голосов
/ 20 мая 2011

У меня странная проблема

Методы beginTrasaction () и commit () Zend_DB_Adapter не работают должным образом. У меня есть операторы INSERT (в FOR LOOP), заключенные в методы beginTrasaction () и commit (). Но даже когда возникает ошибка, как показано ниже, я все еще вижу некоторые вставленные строки, хотя я ожидал, что фиксация не произойдет, так как ошибки произошли. Я не могу понять, почему. Может кто-нибудь помочь. спасибо.

SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись '0' для ключа 'PRIMARY'

кодовый блок как:

      **$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 Ответ

9 голосов
/ 20 мая 2011

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