了解しました。最初にこれを邪魔にならないようにします。私の質問はこれに似ています: 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();
これにより、モデルインスタンスごとに複数のトランザクションを実行せずに、複数のテーブルのトランザクションの余地がなくなります。ベースデータベースインスタンスに戻らずにアイデアはありますか?