2016-05-02 9 views
0

私はphpBBを使用していますが、このコードは期待どおりに動作していません。単にphpBB sql_transaction関数を使用してSQLトランザクションを開始し、コミットします。しかし、例外は半分の方法でスローされ、同じ関数を使用してロールバックを発行する必要があります。phpBB SQLトランザクション機能が動作しません

ただし、ロールバックは発生しません。クエリ1と2が有効になり、ロールバックすることができません。

documentationには、SQLエラーがあると自動的にロールバックが発行されると記載されていますが、タイムアウトなどのPHPエラーがある場合はロールバックしようとしています。

私はMySQL 5.7、phpBB 3.0.11、およびphp 5.6を使用しています。

誰かが問題を指摘できますか?

$db->sql_transaction('begin'); 

try { 
    $sql = 'UPDATE aaa_temp SET method = "a" WHERE id = 1'; 
    $db->sql_query($sql); 

    $sql = 'UPDATE aaa_temp SET method = "b" WHERE id = 2'; 
    $db->sql_query($sql); 

    throw new Exception('OMG TOTAL ERROR'); 

    $sql = 'UPDATE aaa_temp SET method = "c" WHERE id = 3'; 
    $db->sql_query($sql); 

} catch (Exception $ex) { 
    $db->sql_transaction('rollback'); 
    trigger_error($ex->getMessage(), E_USER_ERROR); 
} 

$db->sql_transaction('commit'); 

ありがとうございます!本当にシンプルで愚かなものになる必要があることは分かっていますが、詳細が必要な場合は教えてください。

EDIT:明らかに、私はMySQLのSQLトランザクションについて話しています。

+0

「新しい例外をスローする」の前に2つのUPDATEクエリが実行されている理由は何ですか? – Webeng

+0

私は彼らが処刑されていることを知っていますが、彼らは取引の一部でなければなりません。スローされた例外があり、ロールバックが発行されたときに、彼らはなぜ成功していますか?これらの2つの更新をロールバックしてはいけませんか? –

答えて

0

更新をロールバックしようとしていたテーブルが、トランザクションをサポートしていないMyISAMストレージエンジンを使用していたことが判明しました。

皮肉なことに、それはphpBBがそれらをどのように構築するのかということです。 sql_transaction('rollback')はロールバックが実際に機能したためtrueを返しました。ロールバックされていないデータについてのSQL警告を受け取っていませんでした。

は、この機能はバックグラウンドでやっていたかを正確に確認するためにMySQLでgeneral_query_logを有効にすることで、これを考え出した:私は、MyISAMテーブルとInnoDBのテーブルの混合物を持っていたので、そう

SET AUTOCOMMIT=0; 

UPDATE aaa_temp SET method = "a" WHERE id = 1; 

UPDATE aaa_temp SET method = "b" WHERE id = 2; 

ROLLBACK; 

SET AUTOCOMMIT=1; 

、後者のものに変更はなかったですフォーマーへの変更はなかった。

-1

あなたは例外の仕組みを誤解しています。 try{...}catch(...){...}ブロックがあり、try{...}部分のどこかに例外がスローされた場合、コードが流れている信号はcatch(...){...}ブロックの先頭にジャンプします。

例外がスローされる前に発生したすべてのコードが実行されます。例外の後のtryブロック内のコードのみが発生しません。以前は行われていたすべてのプロセスを排除するために、PHP開発者にとって非常に(異常に)難しいものがあるため、rollbackはありません。あなたのPHPコードが電子メールを送信するような何かをしたと想像してください。電子メールがすでに送信されたときに、どのようにロールバックが行われると思いますか?したがって、ロールバックは発生しません。

+0

申し訳ありませんが、私はSQLトランザクションについて説明しています。 phpBBには 'sql_transaction'関数があり、トランザクションと対話することができます。最初の2つの更新文が実行されたにもかかわらず、mysqlは '$ db-> sql_transaction( 'rollback');を呼び出すときにそれらをロールバックする必要があります。 –

関連する問題