悲观锁:
很悲观,认为什么时候都加锁,无论做什么都会加锁
乐观锁:
很乐观,认为什么时候都不会出现问题,所以不会加锁,更新数据的时候去判断一下,在此期间是否有人修改过这个数据
获取version
更新的时候比较version
Redis监视测试
正常执行成功
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(TX)> DECRBY money 20
QUEUED
127.0.0.1:6379(TX)> INCRBY out 20
QUEUED
127.0.0.1:6379(TX)> EXEC //事务正常结束,数据期间没有发生变动,这个时候正常执行成功
1) (integer) 80
2) (integer) 20
测试多线程修改值,使用watch可以当作redis的乐观锁操作
127.0.0.1:6379> WATCH money //监视money
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> DECRBY money 10
QUEUED
127.0.0.1:6379(TX)> INCRBY out 10
QUEUED
127.0.0.1:6379(TX)> EXEC //执行之前,另外一个线程修改了我们的值,那么就会执行失败
(nil)
如果失败,获取最新值就好
需要解锁,然后重新监视
127.0.0.1:6379> UNWATCH //如果发现事务执行失败,就先解锁
OK
127.0.0.1:6379> watch money //获取最新的值,再次监视,select version
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> DECRBY money 1
QUEUED
127.0.0.1:6379(TX)> INCRBY out 1
QUEUED
127.0.0.1:6379(TX)> EXEC //比对监视的值是否发生了变化,如果没有变化,那么可以执行成功,如果变化就执行失败
1) (integer) 999
2) (integer) 21