首页 > 其他 > 详细

redis 事物

时间:2018-03-14 23:36:42      阅读:418      评论:0      收藏:0      [点我收藏+]

   1.范例

multi //事物开启
普通命令 //把命令加入队列
exec //执行

 2.错误类型

       (1)语法错误

    这种,exec,报错, 所有语句都不会执行

  (2)运行错误

    这种exec时,比如 zadd 操作list对象,Exec之后,会执行正确的语句,并跳过有不适当的语句.

  3.思考:

 

  我正在买票

 

  Ticket -1 , money -100

 

  而票只有1, 如果在我multi之后,exec之前, 票被别人买了---ticket变成0.

 

  我该如何观察这种情景,并不再提交

 

 

 

  悲观的想法:

 

  世界充满危险,肯定有人和我抢, ticket上锁, 只有我能操作. [悲观锁]

 

 

 

  乐观的想法:

 

  没有那么人和我抢,因此,我只需要注意,

 

  --有没有人更改ticket的值就可以了 [乐观锁]

 

 

 

  Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.

 

 

  

 

 

 

  悲观的想法:

 

  世界充满危险,肯定有人和我抢, ticket上锁, 只有我能操作. [悲观锁]

 

 

 

  乐观的想法:

 

  没有那么人和我抢,因此,我只需要注意,

 

  --有没有人更改ticket的值就可以了 [乐观锁]

 

 

 

  Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.

  

  具体的命令----  watch命令

 

  例:

 

  redis 127.0.0.1:6379> watch ticket

 

  OK

 

  redis 127.0.0.1:6379> multi                                                   // 在事物exec之前,另一个进程decr ticket,然后事物监测到了ticket变化,在执行exec时候所有事物里面的命令都不会执行

 

  OK

 

  redis 127.0.0.1:6379> decr ticket

 

  QUEUED

 

  redis 127.0.0.1:6379> decrby money 100

 

  QUEUED

 

  redis 127.0.0.1:6379> exec

 

  (nil)   // 返回nil,说明监视的ticket已经改变了,事务就取消了.

 

  redis 127.0.0.1:6379> get ticket

 

  "0"

 

  redis 127.0.0.1:6379> get money

 

  "200"

       

 

 

  watch key1 key2  ... keyN

  作用:监听key1 key2..keyN有没有变化,如果有变, 则事务取消

 

  unwatch

  作用: 取消所有watch监听

 

        

    

 

redis 事物

原文:https://www.cnblogs.com/zxqblogrecord/p/8570725.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!