10

mysql innodb トランザクションでは、重複キー エラーによってロールバックが発生すると予想されます。そうではなく、単純にエラーをスローして次のコマンドに進みます。COMMIT コマンドに到達すると、トランザクションはコミットされ、重複キーの原因となるコマンドは削除されます。

これは予想される動作ですか?もしそうなら、そのようなエラーが発生したときにトランザクションがコミットされるのではなくロールバックされるように設定するにはどうすればよいでしょうか?

テスト環境:

CREATE TABLE `test` (  
  `id` int(11) NOT NULL, 
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

BEGIN;
     INSERT INTO test VALUES (5);
     INSERT INTO test VALUES (5);
COMMIT;

期待される結果: テーブルtestは空です

実際の結果: テーブルtestには値が 5 のレコードが 1 つ含まれます

4

2 に答える 2

9

重複が原因で挿入が失敗した場合、データベースはトランザクションをそのステートメントの先頭にロールバックします。

ステートメントの先頭に作成された内部セーブポイントを使用してから、そのセーブポイントにロールバックします。

トランザクション全体をロールバックするわけではありません。

mysql クライアントの動作は、コマンド ライン パラメータを使用して構成できます。終了する (暗黙的にロールバックする) か、続行することができます。

独自のアプリを使用している場合、それが何をするかはあなた次第です。


Mysql は、障害の処理方法に POLICY を課しません。それはアプリケーションに任されています。したがって、それらについて何をするかはあなた次第です。必要に応じてそれらを無視できます。

于 2009-10-27T13:15:52.597 に答える
3

エラーが発生した場合、MySql(および他のSQLエンジンAFAIK)はトランザクションを自動的にロールバックしません。

トランザクションをロールバックするエラー ハンドラを宣言する必要があります。

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN 
  ROLLBACK; 
  CALL ERROR_ROLLBACK_OCCURRED; 
END;
于 2010-07-22T17:44:14.937 に答える