标签:客户端 第一个 exec nbsp 利用 image code 修改 strong
很悲观,什么时候都会出问题,无论做什么都加锁,影响效率。
①正常情况执行成功(单线程):
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) 10 127.0.0.1:6379>
②多线程执行事务
开启两个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 #监视 money对象
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379>
第二个客户端突然插队执行
127.0.0.1:6379> get money "100" 127.0.0.1:6379> set money 1000 OK 127.0.0.1:6379>
第一个客户端在执行事务,会执行失败!
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 10 QUEUED 127.0.0.1:6379> incrby out 10 QUEUED 127.0.0.1:6379> exec (nil) 127.0.0.1:6379>
使用watch可以当作Redis的乐观锁操作!可以理解mysql中的 get version。在执行之前,先获取是否已经被修改了,如果被修改则执行失败!!
①放弃乐观锁(unwatch)
②重新执行(重新监视,获取最新的锁)
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> decrby money 10 QUEUED 127.0.0.1:6379> incrby out 10 QUEUED 127.0.0.1:6379> exec (nil) 127.0.0.1:6379> unwatch OK 127.0.0.1:6379> watch money OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> decrby money 1 QUEUED 127.0.0.1:6379> incrby out 1 QUEUED 127.0.0.1:6379> exec 1) (integer) 999 2) (integer) 1 127.0.0.1:6379>
标签:客户端 第一个 exec nbsp 利用 image code 修改 strong
原文地址:https://www.cnblogs.com/ckfuture/p/14399781.html