zoukankan      html  css  js  c++  java
  • redis简单的事务

    Redis与 mysql事务的对比

    占位 Mysql Redis
    开启 start transaction muitl
    语句 普通sql 普通命令
    失败 rollback 回滚 discard 取消
    成功 commit exec

    注: rollback与discard 的区别
    如果已经成功执行了2条语句, 第3条语句出错.
    Rollback后,前2条的语句影响消失.
    Discard只是结束本次事务,前2条语句造成的影响仍然还在

    注:
    在mutil后面的语句中, 语句出错可能有2种情况
    1: 语法就有问题,
    这种,exec时,报错, 所有语句得不到执行

    2: 语法本身没错,但适用对象有问题. 比如 zadd 操作list对象
    Exec之后,会执行正确的语句,并跳过有不适当的语句.

    (如果zadd操作list这种事怎么避免? 这一点,由程序员负责)

    案例:

    我正在买票
    Ticket -1 , money -100
    而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了---即ticket变成0了.
    我该如何观察这种情景,并不再提交

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

    乐观的想法:
    没有那么人和我抢,因此,我只需要注意,
    --有没有人更改ticket的值就可以了 [乐观锁]

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

    具体的命令---- watch命令
    例:
    redis 127.0.0.1:6379> watch ticket
    OK
    redis 127.0.0.1:6379> multi
    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监听

  • 相关阅读:
    【转】以太坊分片:Overview and Finality
    Raiden Network — Ethereum 区块链支付通道
    ERC 和 EIP 代表什么呢?
    【转】什么是加密经济学
    Ethereum Probabilistic Micropayments
    【转】以太坊钱包分析与介绍
    【转】用Python从零开始创建区块链
    【转】用 Go 构建一个区块链
    通用权限管理系统组件 (GPM
    通用权限管理系统组件 (GPM
  • 原文地址:https://www.cnblogs.com/qinsilandiao/p/10872493.html
Copyright © 2011-2022 走看看