6

了解しました。最初にこれを邪魔にならないようにします。私の質問はこれに似ています: ZendFrameworkでトランザクションをロールバックできません

私のテーブルは常にinnoDBです。問題のテーブルを確認しましたが、実際にはinnoDBです。問題に移ります。

データベースインスタンスがあり、同じデータベースにヒットするこのトランザクションを実行しているモデルインスタンスは次のとおりです。

$db->beginTransaction();

try { 
  // Run an insert
  $model_record->insert(array('single_item' => 'its value'));

  // More logic, and run an update.
  $model_record->this_value = 'that';

  // Save it
  $model_record->save();

  //Commit the transaction
  $db->commit();
} catch (Exception $e) {

  // It finds the rollback, yet does nothing.
  $db->rollBack();  
}

これが機能しないことがわかった理由は、テスト中に行の文字数制限を超えて、配置されているすべてのロジックが正しいことを確認したためです。

ロールバックしませんでした。その上、「single_item」のレコードがデータベースにありました。しかし、更新された値はそうではありませんでした。

私は何か小さなものを完全に見逃していますか?MySQLとinnoDBでトランザクションの問題が発生したことはありません。これはMySQL関連またはZF関連でしょうか?どんな洞察も役に立ちます、ありがとう。

アップデート:

私はさらにいくつかのテストを実施してきましたが、次のような結果が役立つ可能性があります。

    $this->_db->beginTransaction();

    // This works
    $this->_db->insert('table_a', 
        array(
           'a_field' => 'transaction test',
        )
    );

    // This does not work, at all.  It inserts and does not rollback.  There is no commit.
    $_table_a_model->insert(
        array(
            'a_field' => 'transaction test',
        )
    );

    $this->_db->rollback();

追加の更新 モデルのインスタンスを取得し、そのインスタンスでトランザクションを呼び出す必要があります。

$the_model = $this->_model->getAdapter();
$the_model->beginTransaction();

これにより、モデルインスタンスごとに複数のトランザクションを実行せずに、複数のテーブルのトランザクションの余地がなくなります。ベースデータベースインスタンスに戻らずにアイデアはありますか?

4

2 に答える 2

4

私はそれを考え出した。$db = Zend_Db_Table_Abstract::getDefaultAdapter();複数のモデルのすべての操作が単一のトランザクションの下で連携するように、トランザクションを使用して実行する必要があります。誰かがそれを修正した場合は、コメントしてください。

于 2012-09-10T21:42:32.660 に答える
1

たぶんあなたのテストケースは、最大文字数を超えると、挿入されたデータが切り捨てられ、実際には例外が発生しませんか?テーブルの名前を間違って入力するようなことをすると、例外が発生すると仮定します(そうでない場合は、PDO :: ERRMODE_EXCEPTIONが有効になっていることを確認してください)。catchブロックが起動してロールバックするという例外を本当に発生させている場合、代わりにコミットが発生していて、rollback()を呼び出さない場合は、期待どおりの結果が得られるように聞こえます。

ああ、そしてあなたのコードを見て、$dbがあなたのモデルクラスのそのコントローラーと同じインスタンスであることを確認する必要があると仮定します。ここを見て、同じ$dbハンドルが全体でどのように使用されているかを確認してください。

編集: @Wesはそれを理解しました。「$db= Zend_Db_Table_Abstract :: getDefaultAdapter();を使用してから、トランザクションを実行して、複数のモデルのすべての操作が1つのトランザクションで連携するようにする必要があります。誰かが修正した場合は、コメントしてください。」

于 2012-09-10T18:45:28.397 に答える