操作員A | 操作員B |
(1)、操作員A此時將用戶信息讀出(此時version=1),並準備從其帳戶餘額中扣除$50($100-$50) | (2)、在操作員A操作的過程中,操作員B也讀入此用戶信息(此時version=1),並準備從其帳戶餘額中扣除$20($100-$20) |
(3)、操作員A完成了修改工作,將數據版本號加1(此時version=2),連同帳戶扣除後餘額(balance=$50),提交至數據庫更新,此時由於提交數據版本大於數據庫記錄當前版本,數據被更新,數據庫記錄version更新爲2 | |
(4)、操作員B完成了操作,也將版本號加1(version=2)並試圖向數據庫提交數據(balance=$80),但此時比對數據庫記錄版本時發現,操作員B提交的數據版本號爲2,數據庫記錄當前版本也爲2,不滿足“提交版本必須大於記錄當前版本才能執行更新”的樂觀鎖策略,因此,操作員B的提交被駁回 |
123
Session 1 | Session 2 |
(1)第1步 redis 127.0.0.1:6379> get age "10" redis 127.0.0.1:6379> watch age OK redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379> | |
(2)第2步 redis 127.0.0.1:6379> set age 30 OK redis 127.0.0.1:6379> get age "30" redis 127.0.0.1:6379> | |
(3)第3步 redis 127.0.0.1:6379> set age 20 QUEUED redis 127.0.0.1:6379> exec (nil) redis 127.0.0.1:6379> get age "30" redis 127.0.0.1:6379> |