The Dabsong Conshirtoe

技術系の話を主にします。

SQLアンチパターン「ランダムセレクション」の補足(でもないけど)

解決策③「すべてのキー値のリストを受けとり、ランダムに 1 つを選択する」では、当然の話だけどトランザクションの考慮も必要ですよねって話。なんだか書いてて当たり前すぎて消そうかと思ったけどもったいないので公開します笑

例えば以下のような手順をとるとする。
(execute_queryはクエリを実行して結果セットを良い感じに取得するメソッドを想像してください)

ids = execute_query(u'SELECT bug_id FROM Bugs;')
target_id = random.choice(ids)
record = execute_query(u'SELECT * FROM Bugs WHERE bug_id = %d;' % target_id)

この場合、target_idのレコードを3行目実行前に別のプロセスにより削除された場合はrecordを取得することができませんので、アプリケーション側でrecordが取得できないことを考慮できていない場合に思わぬ例外に繋がり得ます。

これを防ぐために、取得できなかった場合は後続の処理を実行しない、または例外を投げるなどの配慮が必要ですね。

基本的なことですがこういう考慮が抜けるとバグにつながるので気をつけましょう。>自分

SQLアンチパターン

SQLアンチパターン