あるシステムで、MySQLをオンプレからAuroraに移行してテストしたところ、異常発生した際に操作ログ保存用のテーブルにレコードが保存されなくなったことが判明。
原因を調べたところ、MyISAMテーブルがInnoDBテーブルに変わっていたことが判明。
AuroraはMyISAMテーブルをサポートしていないので、移行時にInnoDBに変わってしまっていた模様。
これによって、トランザクション制御が効いてロールバックされるようになっていた。
(MyISAMテーブルはトランザクションの概念がないため、常に自動コミット同様となる)
つまり、ログ保存用のテーブルに書き込んだあとに異常発生時はロールバックしていたため、ログもロールバックされていた・・・(ログの意味無し!)。
が、単純にトランザクションのタイミングをずらそうとすると、ログテーブルへの書き込み前後両方でトランザクションテーブル(これは逆にまとめてロールバック必要)に書き込みしている箇所も多々あり、ずらすこともできない。
1.トランザクション開始
2.テーブルA更新
3.操作ログテーブル登録(もとはMyISAMテーブルなので、異常でもロールバックされなかった)
4.テーブルB更新
5.正常ならコミット、 異常ならロールバック(3も含めてロールバック、、、)
2~4の処理順変えるのも困難なコードだったので、これは詰み?
かと思ったが、よくよく考えれば、ログテーブル登録だけコネクションを別にすれば解決だった。
1.トランザクション開始
2.テーブルA更新
3.別コネクションで操作ログテーブル登録(この時点でコミットされるので、5でロールバックされても無関係)
4.テーブルB更新
5.正常ならコミット、 異常ならロールバック(2と4だけがちゃんとロールバックされる)
ただ、もうちょっとマシな方法ないのか、これ。。