状況
口座 1 から口座 2 へ 5000 円を移す処理を AI アシスタントに書かせた。アプリは autocommit(1 文ごとに確定)で DB につないでいる。
このまま使ったときの問題は?
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;UPDATE accounts SET balance = balance + 5000 WHERE id = 2;正答
- 5000 を文字列の '5000' と書かないと、balance と型が合わず失敗する
- 2 文の間で失敗すると引くだけが確定する。BEGIN〜COMMIT でまとめる
- id は主キーなので、それぞれの UPDATE に LIMIT 1 を付けるべき
- id = 2 を先に更新しないと、id = 1 の行がロックされて止まる
解説
autocommit では 1 文目が終わった時点で確定する。2 文目の前にアプリが落ちたり通信が切れたりすると、口座 1 から 5000 円が引かれたまま口座 2 には入らない。2 つで 1 つの意味を持つ更新は BEGIN〜COMMIT で囲み、途中で失敗したら ROLLBACK する。AI は SQL を文ごとに正しく書いても、どこで確定するかまでは書かないことが多い。数値を文字列にする必要はない。主キーの条件なら LIMIT は不要。更新の順番はデッドロック対策の話で、単独の処理が止まる理由にはならない。
参考: www.sqlite.org
この問題を含む AI の出力チェック のテストを制限時間つきで解く
AI の出力チェッククイズへ