AI の出力チェック4 択難易度 標準

状況

口座 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;

正答

  1. 5000 を文字列の '5000' と書かないと、balance と型が合わず失敗する
  2. 2 文の間で失敗すると引くだけが確定する。BEGIN〜COMMIT でまとめる
  3. id は主キーなので、それぞれの UPDATE に LIMIT 1 を付けるべき
  4. id = 2 を先に更新しないと、id = 1 の行がロックされて止まる

解説

autocommit では 1 文目が終わった時点で確定する。2 文目の前にアプリが落ちたり通信が切れたりすると、口座 1 から 5000 円が引かれたまま口座 2 には入らない。2 つで 1 つの意味を持つ更新は BEGIN〜COMMIT で囲み、途中で失敗したら ROLLBACK する。AI は SQL を文ごとに正しく書いても、どこで確定するかまでは書かないことが多い。数値を文字列にする必要はない。主キーの条件なら LIMIT は不要。更新の順番はデッドロック対策の話で、単独の処理が止まる理由にはならない。

参考: www.sqlite.org

sqltransactionatomicity

この問題を含む AI の出力チェック のテストを制限時間つきで解く

AI の出力チェッククイズへ