4. 例(Rails)
Id money
1 400
User.transaction do
user = User.lock.find_by(id: 1)
user.money += 400
user.save!
end
BEGIN;
SELECT * FROM users WHERE id = 1 FOR UPDATE;
UPDATE users SET users.money = 800 WHERE id = 1;
COMMIT;
usersテーブル
悲観ロック
5. 例の問題
リクエスト リクエスト
BEGIN;
SELECT * FROM users WHERE id = 1 FOR
UPDATE;
UPDATE users SET users.money = 800
WHERE id = 1;
COMMIT;
BEGIN;
SELECT * FROM users WHERE id = 1 FOR
UPDATE;
UPDATE users SET users.money = ? WHERE id
= 1;
COMMIT;
この値はいくつで
しょう?
悲観ロックなので待ちます
同時
6. 例の答え
リクエスト リクエスト
BEGIN;
SELECT * FROM users WHERE id = 1 FOR
UPDATE;
UPDATE users SET users.money = 800
WHERE id = 1;
COMMIT;
BEGIN;
SELECT * FROM users WHERE id = 1 FOR
UPDATE;
UPDATE users SET users.money = 800 WHERE
id = 1;
COMMIT
このselect文では
user.money = 400
が取得されている