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 命令都会清除连接中的监视

  • 相关阅读:
    Pathfinding 模板题 /// BFS oj21413
    poj2186-Popular Cows(强连通分支)
    求有向强连通分量 模板
    F. Relatively Prime Powers (求([2,n],内不是次方的数量)
    【2018沈阳赛区网络预选赛J题】Fantastic Graph 【有上下界的网络流】
    Zoj 2314 Reactor Cooling(无源汇有上下界可行流)
    有上下界网络流模板
    有上下界网络流建模方法
    有上下界的网络流问题 的理解分析
    ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(约束第K短路)
  • 原文地址:https://www.cnblogs.com/hexu6788/p/5177811.html
Copyright © 2011-2022 走看看