zoukankan      html  css  js  c++  java
  • 四. Redis事务处理

    Redis目前对事务的支持还是比较简单,Redis能保证一个Client发起的事务中的命令可以连续执行,而中间不会插入其他Client的命令;当一个Client在连接中发起一个multi命令的时候,这个连接会进入事务上下文,而连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令的时候,redis会顺序的执行该队列中的所有命令。

    Redis事务涉及的命令关键字:MULTI 进入一个事务上下文,EXEC 执行事务 ,DISCARD 回滚事务 , Watch 事务乐观锁

    在SQLServer 或 Mysql 当中的事务(当事务中操作出现错误的时候,会完全回滚事务)。但是在 Redis 中会有些不一样。

    可以从下面命令执行过程中看到:

    127.0.0.1:6379> set age 10
    OK
    127.0.0.1:6379> set name hexu
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> incr age
    QUEUED
    127.0.0.1:6379> incr name
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 11
    2) (error) ERR value is not an integer or out of range
    127.0.0.1:6379> get age
    "11"
    127.0.0.1:6379> get name
    "hexu"

    key["age"]是一个int,key["name"]是一个字符串,当我们通过incr命令递增age和name的时候,name出现错误,最后我们执行exec命令,age的结果没有回滚。这就redis需要改进的地方。

    事务乐观锁

    watch 命令会监视给定的key ,当exec时候,如果监视的key发生过变化,则整个事务失败。

    当有多个Session时,Seesion1 首先开启事务,对 age 赋值为 100,此时事务暂时未被Exec。Session2使用非事务方式对 age 赋值为 120,赋值完成。然后 Session1执行 Exec命令。当一个key被加上乐观锁的时候,该事务会执行失败。

    Session1:

    127.0.0.1:6379> WATCH age      第一步
    OK
    127.0.0.1:6379> MULTI          第二步
    OK
    127.0.0.1:6379> set age 100      第三步
    QUEUED
    127.0.0.1:6379> EXEC          第五步
    (nil)

    Session2:

    127.0.0.1:6379> set age 120      第四步
    OK

    使用 EXEC,DiSCARD,UNWATCH 命令都会清除连接中的监视

  • 相关阅读:
    flash中网页跳转总结
    as3自定义事件
    mouseChildren启示
    flash拖动条移出flash无法拖动
    需要一个策略文件,但在加载此媒体时未设置checkPolicyFile标志
    Teach Yourself SQL in 10 Minutes
    电子书本地转换软件 Calibre
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes – Page 31 练习
  • 原文地址:https://www.cnblogs.com/hexu6788/p/5177811.html
Copyright © 2011-2022 走看看