乐观锁和悲观锁是一种程序设计思想,而不是具体的代码。乐观锁和悲观锁应用的场景有很多,在数据库和多线程等等都会用到。
正常情况,执行成功:
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 //监视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
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> DECRBY money 20
QUEUED
127.0.0.1:6379> INCRBY out 20
QUEUED
127.0.0.1:6379> EXEC //执行之前,另一个线程修改了我们的值,这时候就会导致执行失败!
(nil)
127.0.0.1:6379> unwatch money //先解锁
OK
127.0.0.1:6379> watch money //再次放置锁,再次见识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