2

データベースエラーを処理するための最良の方法を実装しようとしています。私はmvcフレームワーク(codeigniter)を使用しています。オブジェクトを作成しようとすると、異なるテーブルに対して複数のクエリを実行することになります。

私が抱えている問題は、最初のクエリが成功し、2番目のクエリが失敗した場合、エラーが発生することです。ただし、最初のクエリは引き続き成功し、データはすでにそのテーブルにあります。

私がやりたいのは、すべてのクエリをtryブロックにラップすることです。そうすれば、いずれかのクエリが失敗しても、どのクエリも完了しません。

変更をロールバックすることで、この状況(おそらくcodeigniter固有)を処理するためのより良い方法はありますか?

4

3 に答える 3

4

tryブロックはそれを直接行いません...。

トランザクションをサポートするテーブル、つまりInnoDBテーブルが必要です

まず、データベーステーブルのデータベースエンジンをInnoDBに変更する必要があります(とにかくMyISAMの場合)。

データベース操作の前に、トランザクションを開始する必要があります(自分に合った方法をオンラインで確認してください)。私はPDOを使用しているので、通常は次のようにします。

$pdoObject->startTransaction();

したがって、クエリの戻り値から、成功した場合は次のクエリに進み、そうでない場合はrollback()実行を実行して終了します。この時点で、クエリの実行が失敗した場合に例外をスローすることを決定できるため、try...catchが役立つ可能性があります。あなたはそれをキャッチし、rollback()

すべてが成功した場合は、他のことを行う必要がありcommit()ます。変更は反映されません。

注:MySQLのトランザクションをサポートするのはInnoDBテーブルのみです

于 2012-05-31T14:20:47.623 に答える
1

あなたが探しているのはトランザクションと呼ばれます。

ただし、すべてのテーブルがInnoDBを使用していることを確認する必要があります。

于 2012-05-31T14:16:22.813 に答える
0
if ($this->db->trans_status() !== false) {
    // do stuff
}

トランザクションを検証するために使用するものです。テストモードのブール値を送信することもできることに注意してください。

$this->db->trans_start(true);
于 2012-06-01T11:00:35.577 に答える