仮説検証
トラブルは出なくなったものの、何かやっぱり納得いかんので、同じ環境を作って実験してみた。
【検証方法】
- DBの構成を実際のものに合わせる。
- UPDATE→SELECTを1トランザクション内で行いそれを1万回繰り返すVBSを2つ作り、同時に起動する。
【結果】
うん、出ない(ノ^^)ノ
う〜ん、For文でひたすら回しまくれば、処理密度としては充分現場レベル(ってかはるかに超えてる)だから、あとはネットワーク越しってくらいしか環境として違うところは無いんだけれどなぁ。
ただ、これで少なくとも、スナップショットが原因でデッドロックになることは無さそう。良かった良かった。
って良くないわ〜。原因不明だわ〜。怖いわ〜。死ぬわ〜。
……ってコレ書いてる最中に思ったけど、もしかしてプログラム側でトランザクション分離レベルをSerializableにでもしてるのかしら……。(DB本体設定はRead Commited)
Serializableにしてたなら、READ_COMMITED_SNAPSHOTをONにしてようが何しようが、SELECT文でトランザクション終了待ちが発生しそうな気がする。二つのトランザクション同士でお互いのロック対象エリアを読み合ったら、ひょっとしてデッドロックになるんじゃ無かろうか。
明日ちょっと検証してみますかねぇ。
ってか、僕本当にデータベースのこと何もわかっとらんなぁ……