mysql で deadlock が発生した場合、暗黙的なコミットが発生しているように見えますが、認識は正しいですか?

投稿者: Anonymous

追記

調査の結果、掲題の認識は誤っており、暗黙的なコミットは発生しておりませんでした。
そのため、本稿は、有意義な質問ではありません。
但し、ありがたいことに回答を頂いているため、削除は行わず、コミュニティによる削除を待たせていただければと思います。


2つのセッション(セッションA と セッションB)で deadlock が発生し、セッションBが rollback されたときに、セッションA では、暗黙的なコミットが発生しているように見えます。

この認識が正しいか、確証が持てないのですが、どこかに仕様の記載があるか、ご存知の方はいらっしゃいませんでしょうか?

MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.2.10 デッドロックの検出とロールバック によれば、

InnoDB では、自動的にトランザクションのデッドロックが検出され、デッドロックを解除するためにトランザクション (複数の場合あり) がロールバックされます。

とあります。

また、 MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.3.3 暗黙的なコミットを発生させるステートメント では、トランザクション制御およびロックステートメント により、暗黙的なコミットが発生する、と記載がありました。

セッションBはロールバックされ、セッションAは、トランザクション制御によりコミットされているのでしょうか?

アプリケーションコードとしては、明示的に Commit していないのに、デッドロックを起因として Commit されるとしたら、意外と気づかないのではないか、と考え、仕様を確認したく、質問しました。

解決

トランザクションは、その作成者が明示的に完了を示さない限り、DBにコミットされることはないと思います。そして、明示的な完了を暗に MySQL に対して示すことになる SQL 文の一覧が、 MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.3.3 暗黙的なコミットを発生させるステートメント のドキュメントで示されているのだと思います。

これは、もし、この「暗黙的なコミットを発生させるステートメント」を実行していたならば、それは他のセッションが自分のセッションとデッドロックを起こしていようがいまいが、関係なく、そのステートメントの完了でもって、暗黙のコミットが行われるのだと思います。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *