美文网首页
Redis-8-事务的使用

Redis-8-事务的使用

作者: 冷风_f818 | 来源:发表于2019-04-28 18:15 被阅读0次

上文中说了redis中的发布与订阅,下面来看一下redis中的事务是如何使用的

redis是一个nosql数据库,那当然也就有事务的功能,但是和关系型数据库中的事务还是有点差异

事务

redis中,可以通过MULTI命令开启一个事务,如下:

172.16.12.3:6379> multi
OK

这样就开始了一个事务, 然后我们继续去执行命令,如下:

172.16.12.3:6379> set k1 v1
QUEUED
172.16.12.3:6379> set k2 v2
QUEUED
172.16.12.3:6379> set k3 v3
QUEUED

这里可以看到,返回值是QUEUED, 这几个命令是都不会被立马执行的,而是放到了一个队列中,然后当所有的命令都输入完成之后, 可以通过exec命令执行事务, 也可以通过discard命令清空队列,如下:

172.16.12.3:6379> exec
1) OK
2) OK
3) OK

事务中的异常

redis中事务的异常情况总的来说分为两类:

  • 进入队列之前就能发现的错误,比如命令输错
  • 执行EXEC之后才能发现的错误,比如给一个非数字字符加1

对于这两种错误,redis有不同的处理策略

对于第一种错误,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务,如下:

172.16.12.3:6379> multi
OK
172.16.12.3:6379> set k1 v1
QUEUED
172.16.12.3:6379> set k2 v2
QUEUED
172.16.12.3:6379> set k3 v3
QUEUED
172.16.12.3:6379> set k4 v4 k
QUEUED
172.16.12.3:6379> exec
1) OK
2) OK
3) OK
4) (error) ERR syntax error

上面 第四个命令是输的错误的命令,但是他也会先进入队列,然后再事务提交的时候,才会报错,但是其他命令是可以执行成功的

对于第二种情况,redis并没有对它们进行特别处理, 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行,如下测试 :

172.16.12.3:6379> multi
OK
172.16.12.3:6379> set k1 v1
QUEUED
172.16.12.3:6379> incr k1
QUEUED
172.16.12.3:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
172.16.12.3:6379> get k1
"v1"

不同于关系型数据库,redis中的事务出错时没有回滚,对此,官方的解释如下:

Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

watch命令

事务中,watch命令可以用来监听一个key,通过监控,可以为redis事务提供(CAS)行为

如果有至少一个被watch监听的key在exec执行之前被修改了,那么整个事务都会被取消,exec返回nil-reply来表示事务已经失败

具体用法看一下下面这个例子:

172.16.12.3:6379> set k1 v1
OK
172.16.12.3:6379> watch k1
OK
172.16.12.3:6379> set k1 v2
OK
172.16.12.3:6379> get k1
"v2"
172.16.12.3:6379> multi
OK
172.16.12.3:6379> set k1 v3
QUEUED
172.16.12.3:6379> exec
(nil)
172.16.12.3:6379> get k1
"v2"

看一下上面的命令,就是先设置了一个k1, 然后监听k1, 再下面就是修改了一下k1的值,这个是在事务外面修改的,所以可以修改成功的

然后开启了一个事务,事务里面再去修改k1的值,然后提交事务,发现返回nil,再去获取k1的值,发现并没有修改成功

unwatch命令

unwatch命令 可以取消对一个key的监控,如下:

172.16.12.3:6379> get k1
"v2"
172.16.12.3:6379> watch k1
OK
172.16.12.3:6379> unwatch
OK
172.16.12.3:6379> multi
OK
172.16.12.3:6379> set k1 v1
QUEUED
172.16.12.3:6379> exec
1) OK
172.16.12.3:6379> get k1
"v1"

ok,事务方面就先说这么多

相关文章

  • Redis-8-事务的使用

    述 上文中说了redis中的发布与订阅,下面来看一下redis中的事务是如何使用的 redis是一个nosql数据...

  • Spring事务的浅析

    1. 事务的使用 Spring中的事务有以下几种使用方式 编程式事务; 使用XML配置声明式事务; 使用注解配置声...

  • 【spring】spring事务

    2019-05-25 声明式事务 使用注解定义事务 @Transactional 使用xml配置事务

  • 多个事务,导致@Transactional 失效

    /** * 默认使用jdcb的事务,jms的事务不会被默认使用,如果使用需要指定 value */ @Bean(n...

  • 同舟共济 —— 事务

    如果对redis事务不熟悉,建议避免使用redis事务 Redis 的事务使用非常简单,不同于关系数据库,它的事务...

  • WCDB 入门

    iOS+macOS使用教程 ORM使用教程 demo 事务一 事务二 事务(Transaction),一般是指要做...

  • 分布式事务

    分布式事务 强一致性事务 XA 柔性事务 BASE2.1 不使用事务,业务侧补偿 SAGA模式2.2 使用柔性事务...

  • 黑猴子的家:JDBC -> mysql 事务案例实操

    1、准备数据 (1)数据信息 (2)表信息 2、没有使用事务 3、使用了事务1 4、使用了事务2

  • Fragment事务流程分析

    Fragment事务流程分析 简言 简单的事务使用流程代码 使用的方法很简单,但是Activity是如何实现事务的...

  • Innodb中的undo log

    Innodb实现事务的原子性时,使用的是undo log,当事务失败时,就使用undo log回滚事务的修改。 使...

网友评论

      本文标题:Redis-8-事务的使用

      本文链接:https://www.haomeiwen.com/subject/fbmjnqtx.html