1

を使おうとしていますActiveRecord::Base.transaction。Rails 1.2.6 と mysql 5.0 を使用すると、デフォルトではロールバックが機能しないことがわかりました。もう少し遊んでautocommitみると、mysql接続で0に設定されていないことがわかりました。

質問:

1) すべての接続に対してレールで自動コミットを無効にするにはどうすればよいですか?

2) トランザクションである必要のない他のコードに悪影響を及ぼしますか?

4

4 に答える 4

5

明示的なトランザクションを必要とするコードと自動コミットに依存できるコードが混在している場合、すべての接続に対して自動コミットを無効にしないでください。これが他のコードに影響を与えるかどうか疑問に思っているあなたは、正しい軌道に乗っています。自動コミットを無効にしても、作業をコミットするためにコミットする必要があることを他のコードが認識していない場合、それは問題になります。コミットされていない作業は、接続が閉じるとロールバックされます。

MySQL のデフォルトのストレージ エンジンはMyISAMであり、トランザクションをまったくサポートしていないことに注意してください。MyISAM を使用するテーブルに変更を加えると、トランザクションの開始と終了の明示的な要求に関係なく、また自動コミットの状態に関係なく、変更は事実上即座にコミットされます。そのため、 InnoDBストレージ エンジン (またはBDBなどの他のトランザクション セーフ ストレージ エンジン)を使用してテーブルを作成しない限り、何があってもロールバックすることはできません。

MySQLでトランザクションを使用するために自動コミット モードを無効にする必要はありません。トランザクションを明示的に開始するだけです。次の SQL ステートメントは、現在の接続の autocommit の値に関係なく、そのトランザクションをコミットまたはロールバックするまでトランザクションの一部になります。

http://dev.mysql.com/doc/refman/5.0/en/commit.html言います:

START TRANSACTION を使用すると、COMMIT または ROLLBACK でトランザクションを終了するまで、自動コミットは無効のままになります。その後、自動コミット モードは以前の状態に戻ります。

于 2008-12-05T18:53:53.287 に答える
1

トランザクションを使用するために自動コミットを無効にする必要はありません。トランザクションの自動コミット設定を開始しても違いがない場合は、明示的に COMMIT または ROLLBACK する必要があります。さらに、自動コミットを無効にすると、非トランザクション コードに影響します。

于 2008-12-05T19:21:32.967 に答える
1

正しい答え。トランザクションの開始時にコードで DROP TABLE IF EXISTS を実行していました。MySQL では、トランザクション内の DROP ステートメントに問題があるようです。

http://bugs.mysql.com/bug.php?id=989

DROP ステートメントの前に "SET aucotommit = 0" を送信する問題の正しい回避策を推測したほど面白いです。

ご協力ありがとうございました

于 2008-12-07T06:19:54.523 に答える
0

特にトランザクション コードではないというわけではありません。ほとんどすべてが ActiveRecord オブジェクトです。メソッドの 1 つが失敗した場合にロールバック動作が必要なだけです。

私はもっ​​と探検します、あなたは正しいようです-mysqlコンソールであなたの答えを確認できます。ただし、Rails アプリケーションでは、ロールバックを機能させるために connection.execute("set autocommit = 0") を実行する必要があります。

于 2008-12-05T21:33:47.660 に答える