14. 楽観ロックある時とない時の違い
UPDATE `users` SET `money` = 4,
`updated_at` = '2015-02-25
11:07:28', `lock_version` = 3
WHERE (`users`.`id` = 2 AND
`users`.`lock_version` = 2)
楽観ロックがないときの
SQL
楽観ロックがあるときの
SQL
UPDATE `users` SET `money` =
4, `updated_at` = '2015-02-25
11:07:28’ WHERE (`users`.`id` = 2)
15. 悲観ロックの実装
•Railsの場合
•SQL
BEGIN
SELECT `users` WHERE (`users`.`id` = 2) FOR UPDATE
…
COMMIT または ROLLBACK
user = User.find_by!(id: 2) (あらかじめインスタンスを取得しておく)
ActiveRecord::Base.transaction do
user.lock!
end
18. Id money
1 400
例(Rails+MySQL)
User.transaction do
user = User.find_by(id: 1)
user.money += 400
user.save!
end
BEGIN;
SELECT * FROM users WHERE id = 1;
UPDATE users SET users.money = 800 WHERE id = 1;
COMMIT;
usersテーブル
SQLをだす
19. 例リクエスト リクエスト
BEGIN;
SELECT * FROM users WHERE id = 1;
UPDATE users SET users.money = 800
WHERE id = 1;
COMMIT;
BEGIN;
SELECT * FROM users WHERE id = 1;
UPDATE users SET users.money = ? WHERE id =
1;
COMMIT
このとき、?に入る値はいくつ
でしょう?
ほぼ同時にリクエストが飛んできた。
このとき実行されたSQLは以下の通り