MySQL5.1のストアドプロシージャはアトミックでない

http://dev.mysql.com/doc/refman/5.1/ja/begin-end.html

オプションの[NOT] ATOMIC節はまだサポートされていません。これは、トランザクションのセーブポイントがインストラクションブロックの始めにセットされていなく、この文脈中で使用するBEGIN節は現在のトランザクションに対して効果が無いことを意味します。

ということで現状はATOMICじゃないそうです。
つまり、

BEGIN
  SELECT a INTO @tgt_a FROM tb_hoge;
  UPDATE tb_mosa SET b=@tgt_a;
END

とあると、プロシージャが並列に実行された場合、UPDATEの時点でtb_hogeのaの値とtgt_aの値がずれることはありえるってこと。
あ、ちなみにMyISAMの話ね。InnoDBならトランザクション使えばOKだし。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です