watch 命令
redis使用watch命令來實(shí)現(xiàn)樂觀鎖的操作巷折。
首先,我們先來看一下單個(gè)線程情況下崖咨,加上樂觀鎖锻拘,正常執(zhí)行事務(wù)的情況:
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money #監(jiān)聽money對(duì)象,上鎖
OK
127.0.0.1:6379> multi #開啟事務(wù)击蹲,money對(duì)象在事務(wù)執(zhí)行過程中沒有變更署拟,事務(wù)正常執(zhí)行。
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20
接下來歌豺,我們開啟另一個(gè)線程推穷,在之前的線程執(zhí)行事務(wù)之前,對(duì)money對(duì)象的進(jìn)行更改类咧,來看一看對(duì)money上的鎖機(jī)制是否生效:
##線程1
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> ......
此時(shí)線程1馒铃,只是開啟了事務(wù)蟹腾,在這個(gè)過程中還沒有執(zhí)行事務(wù)的操作
##線程2
127.0.0.1:6379> incrby money 20
(integer) 120
此時(shí)線程2,進(jìn)入redis數(shù)據(jù)庫骗露,更改了money對(duì)象的值
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
(nil)
之后我們?cè)诰€程1中執(zhí)行之前的事務(wù)操作岭佳,發(fā)現(xiàn)最終操作失敗,也就是說加在money對(duì)象上的樂觀鎖生效了萧锉。
我們?nèi)绻肴∠麡酚^鎖可以使用 unwatch
命令
127.0.0.1:6379> unwatch
OK