悲观锁:
很悲观,认为什么时候都会出问题,无论做什么都会加锁
乐观锁:
很乐观,认为在什么时候都不会出问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人去改过数据。
获取version。
更新的时候比较verison
wach是加锁的意思
127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> set k2 0
OK
127.0.0.1:6379> watch k1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby k1 20
QUEUED
127.0.0.1:6379> incrby k2 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20
这个是加锁之后正常执行流程
异常流程:
执行事务的时候,另外一个线程修改了值,这个时候,就会导致nil(),导致事务进行失败
unwatch是解除锁,重新绑定
出现异常后:
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> watch k1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby k1 20
QUEUED
127.0.0.1:6379> incrby k2 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 60
2) (integer) 20
这样就可以解决异常了