zoukankan      html  css  js  c++  java
  • redis之事务

    一、是什么

      可以一次执行多个命令,本质是一组命令集合。一个事务中的所有命令都会序列化,按顺序的串行化执行而不被其他命令插入,不许加塞。一个队列中,一次性、顺序性、排他性的执行一系列命令。

    二、事务常用命令

      1、discard:取消事务,放弃执行事务块内的所有命令。

      2、exec:执行所有事务块内的命令。

      3、multi:标志一个事务块的开始。

      4、unwatch:取消watch命令对所有key的监视。

      5、watch key[key ...]:监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。

    三、事务执行结果

      1、正常执行。

      

      2、放弃事务

      

      3、全体连错(只要有一个错就全部失败)

      

       4、冤头债主(谁成功谁执行)

      

      5、watch 监控

      5.1 悲观锁/乐观锁/CAS(check and set)

      悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到很多这种锁,比如行锁,表锁,读锁,写锁等,都是在做操作之前先上锁。

      乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是更新的时候会判断一下在此之间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读应用数据类型,可以提高吞吐量。乐观锁策略:提交版本必须大于记录当前版本才能执行更新。

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

      5.3 有加塞修改,在修改之前,有其他的地方进行修改了。

      5.4 unwatch 取消监听,一旦执行了exec之前加的监控都会被取消掉了。

    六、小结

      watch执令,类似于悲观锁,事务提交时,如果key值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务就不会被执行。

      通过watch命令在事务执行之前监控多个keys,倘若在watch之后有任何key值发生变化,exec命令执行的事务都被放弃,同时返回nullmulti-bulk应答通知调用者事务失败。

      事务三个特性:

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

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

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

  • 相关阅读:
    EF中,保存实体报错:Validation failed for one or more entities. 如何知道具体错误在哪?
    个人常用的移动端浅灰底index.html
    分享一段js,判断是否在iPhone中的Safari浏览器打开的页面
    2017年3月25日,祝自己23岁生日快乐!
    JavaScript监控页面input输入整数且只能输入2位小数
    iPhone IOS10安装APP没提示连接网络(无法联网)的解决办法
    iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)
    iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法
    C# OracleDBhelper
    戴尔灵越15-5000/3558等系列修改BIOS设置U盘启动
  • 原文地址:https://www.cnblogs.com/Hxinguan/p/10229159.html
Copyright © 2011-2022 走看看