WHERE user_id=1 AND item_id=1; value: 1 を取得 UPDATE user_items SET value=10 WHERE user_id=1; value: 10 に更新 UPDATE user_items SET value=1+1 WHERE user_id=1 AND item_id=1; value: 2 に上書き Lost Update COMMIT;
users WHERE id=1 FOR UPDATE; ロック用テーブルで ロック SELECT value FROM user_items WHERE user_id=1 AND item_id=1; value: 1 を取得 BEGIN; SELECT * FROM users WHERE id=1 FOR UPDATE; ロック待ちとなり 更新できない UPDATE user_items SET value=1+1 WHERE user_id=1 AND item_id=1; value: 2 に更新 COMMIT;
WHERE user_id=1; value: 10 に更新 SELECT * FROM users WHERE id=1; ユーザー情報取得 スナップショット UPDATE user_items SET value=20 WHERE user_id=1; value: 20 に更新 SELECT value FROM user_items WHERE user_id=1 AND item_id=1; スナップショットか ら value: 10 を取得 COMMIT;
SELECT * FROM users WHERE id=1 FOR UPDATE; UPDATE user_items SET value=10 WHERE user_id=1; value: 10 に更新 COMMIT; SELECT * FROM users WHERE id=1 FOR UPDATE; ユーザー情報取得 SELECT value FROM user_items WHERE user_id=1 AND item_id=1; スナップショットか ら value: 1 を取得 UPDATE user_items SET value=1+1 WHERE user_id=1 AND item_id=1; value: 2 に上書き Lost Update COMMIT;
GET_LOCK('users:1', 60); ロック待ち SELECT * FROM users WHERE id=1 FOR UPDATE; ユーザー情報取得 SELECT value FROM user_items WHERE user_id=1 AND item_id=1; スナップショットか ら value: 1 を取得 UPDATE user_items SET value=1+1 WHERE user_id=1 AND item_id=1; value: 2 に更新 COMMIT; SELECT RELEASE_LOCK('users:1'); ロック解除 Lost Update 対策 1: GET_LOCK
BEGIN; スナップショット BEGIN; SELECT * FROM users WHERE id=1 FOR UPDATE; UPDATE user_items SET value=10 WHERE user_id=1; value: 10 に更新 COMMIT; SELECT * FROM users WHERE id=1 FOR UPDATE; ユーザー情報取得 SELECT value FROM user_items WHERE user_id=1 AND item_id=1 FOR UPDATE; 最新の value: 10 を 取得 UPDATE user_items SET value=10+1 WHERE user_id=1 AND item_id=1; value: 11 に更新 COMMIT;
id=1 FOR UPDATE; UPDATE user_items SET value=10 WHERE user_id=1; value: 10 に更新 COMMIT; SELECT * FROM users WHERE id=1 FOR UPDATE; ユーザー情報取得 SELECT value FROM user_items WHERE user_id=1 AND item_id=1; 最新の value: 10 を 取得 UPDATE user_items SET value=10+1 WHERE user_id=1 AND item_id=1; value: 11 に更新 COMMIT; Lost Update 対策 3: READ COMMITTED