Redis--事务

  1. 是什么
    • 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行执行而不会被其它命令插入,不许加塞
    • 官网 


    •  
  2. 能干什么
    1. 一个队列中,一次性的、顺序的、排他性的执行一系列命令  
  3. 怎么玩
    • 常用命令

    • Case1:正常执行

    • Case2:放弃事务,使用discard可以使事务放弃执行

    • Case3: 全体连坐,中间有一个失败的命令会使事务的全部命令都不执行,在加入队列的时候就抛出异常,使全体连坐

    • Case4:冤头债主,在加入队列的时候没有抛出异常而是在exec后,事务执行时命令出现异常

    • Case5:watch监控

      • 悲观锁/乐观锁/CAS(Check And Set)

        • 悲观锁:(表锁)悲观锁就是把整张表都锁了,并发性极差,但一致性较好

          •   
        • 乐观锁:(提交的某条记录的版本号必须大于数据库中记录的版本号)乐观锁不锁整表,在每条记录的后面加一个version版本号,张三去改一条记录,此时这条记录的版本是1,此时李四也是改这条记录且版本也是1,且李四修改完成后提交,这条版本号就会变为2,如此是张三修改完成,提交时会出现异常,他修改的的是版本1,但是这条记录的版本是2了,所以会报异常,需要重新从数据中找到版本号为2的记录进行重新修改,才能修改完成。
          •  
        • CAS:
      • 初始化信用卡可用余额和欠额

      • 无加塞篡改,先监控再开启multi,保证两笔金额变动在同一个事务内

      • 有加塞篡改:监控了key,如果key被修改了,后面一个事务的执行失效

      • unwatch(使用内存中最新的数据才能进行修改)


        •   
      • 一旦执行了exec之前加的监控锁都会被取消掉了,wath命令对某条数据进行监控,如果事务执行过程中,被监视的数据被修改过,则事务事务执行不成功,

      • 小结

        • Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行

        • 通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败     

  4. 3阶段
    1. 开启:以MULTI开始一个事务

    2. 入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面

    3. 执行:由EXEC命令触发事务

        
  5. 3特性
    1. 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

    2. 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在"事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题

    3. 不保证原子性: redis同一一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

posted @ 2021-05-24 17:17  张紫韩  阅读(34)  评论(0编辑  收藏  举报