redis--悲观锁、乐观锁
悲观锁:
很悲观、认为什么时候都会出问题、无论做什么都加锁、很影响性能
乐观锁:
1.很乐观、认为什么时候都不会出问题、所以不上锁。更新数据的时候去判断下,在此期间是否有人修改这个数据。
2.获取version
3.更新时比较version
watch (监控、实现乐观锁)
监控测试、正常执行:
my-redis:0>set money 100 ########## 设置余额 100 元 OK my-redis:0>set out 0 ####### 设置花费 0 元 OK my-redis:0>watch money ##### watch 监控 余额 OK my-redis:0>multi ########## 开启事务 OK my-redis:0>decrby money 20 ####### 余额 -20 QUEUED my-redis:0>incrby out 20 ######## 花费 +20 QUEUED my-redis:0>exec ######## 执行事务 80 20 my-redis:0>get money ############ 正常 !数据期间没有发生变动,这个时候就正常执行成功 80 my-redis:0>
测试多线程修复值、使用乐观锁操作。(事务没执行、执行前另一个线程改了余额、监控的值发生变化、这时执行事务会失败)
my-redis:0>get money #### 获取到余额是80 80 my-redis:0>watch money ##### 监控余额 OK my-redis:0>multi #######开启事务 (这时候另一个线程把余额改成1000) OK my-redis:0>decrby money 10 ########余额-10 QUEUED my-redis:0>incrby out 10 ########### 花费+10 QUEUED my-redis:0>exec ######### 执行事务失败,因为监控的余额在执行之前已经被改了 null
怎么解决:在事务执行失败后,解锁 unwatch ,2.再重新获取锁,执行 提交
my-redis:0>unwatch #########解锁 OK my-redis:0>watch money ######重新获取锁 监控 OK my-redis:0>multi ########开启事务 OK my-redis:0>decrby money 10 QUEUED my-redis:0>incrby out 10 QUEUED my-redis:0>exec #########执行成功 990 30
相关推荐
onlypersevere 2020-06-28
sunysh00 2020-06-25
ztyzly00 2020-05-12
mbcsdn 2020-02-02
kevincheung 2020-01-05
bluetears 2019-12-26
Henryztong 2019-12-21
applex 2019-12-14
chenjiazhu 2019-12-13
wensonlee 2019-12-04
houdaxiami 2019-11-17
tangjianft 2019-11-08
luanjun 2019-10-21
txt 2019-10-23
YangSunshine 2019-10-20