悲观锁与乐观锁
事务应用场景
- 一个请求想给余额减8000
- 一个请求想给余额减5000
- 一个请求想给余额减1000
悲观锁(Pessimistic Lock)
每次去拿数据的时候都认为别人会修改,所以在每次拿数据的时候都会上锁,这样别人想拿这个数据就 会阻塞,直到它拿到锁。传统关系型数据库就用到很多悲观锁,比如行锁、表锁等。
乐观锁(Optimistic Lock)
每次去拿数据的时候都认为别人不会修改,所以不会上锁,但在更新的时候会判断一下在此期间别人有 没有去更新这个数据,可以使用版本号机制。乐观锁适用于多读的应用类型,可以提高吞吐量。Redis就 是乐观锁机制实现事务的。
Redis中的乐观锁
watch key [key……]
在执行multi之前,先执行watch监视一个或多个key,如果在事务执行之前这个(或这些)key被其它命 令所改动,那么事务将被打断。
例:开启两个客户端
1号客户端
set money 10000 设置一个money的key
watch money 监视money
multi 开启事务
set money 100 修改money,暂时不执行事务
2号客户端
watch money 监视money
multi 开启事务
set money 110 修改money,暂时不执行事务
1号客户端
exec 执行事务,返回成功
2号客户端
exec 执行事务,更新失败
1号客户端:
2号客户端:
unwatch
取消watch命令对所有key的监视
如果在执行watch命令之后,exec命令或discard命令先执行的话,那么就不需要再执行unwatch。