前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis教程10(事务)

Redis教程10(事务)

作者头像
用户4919348
发布2019-04-02 11:34:14
3380
发布2019-04-02 11:34:14
举报
文章被收录于专栏:波波烤鸭

redis是NOSQL数据库,所以也存在事务,只是此事务和关系型数据库的事务是有区别的。

事务实例

Redis中事务的使用其实非常简单,通过MULTI命令即可。

代码语言:javascript
复制
127.0.0.1:6379> multi
OK

在MULTI命令执行之后,我们可以继续发送命令执行,但此时命令不会立即执行,而是保持到一个队列中,如下

代码语言:javascript
复制
127.0.0.1:6379> set k1 bbb
QUEUED
127.0.0.1:6379> set k2 ccc
QUEUED
127.0.0.1:6379> set k3 ddd
QUEUED
127.0.0.1:6379> set k4 eee
QUEUED
127.0.0.1:6379> get k1
QUEUED

当所有的命令都输入完成后,我们可以输入EXEC命令来执行队列中的命令,如下

代码语言:javascript
复制
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
4) OK
5) "bbb"

事务异常

事务中的异常有两种情况:

进入队列之前发生错误

比较常见的命令错误,此类异常redis的处理方式是,服务器会对进入队列失败的情况进行记录,在执行exec命令提交的时候,对于该命令不会执行并放弃这个事务,如下

代码语言:javascript
复制
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set kk1 a
QUEUED
127.0.0.1:6379> set kk2 b
QUEUED
127.0.0.1:6379> set kk3 c 1 2  # 命令出错
QUEUED
127.0.0.1:6379> set kk4 d
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR syntax error # 执行命令的时候错误提示
4) OK
127.0.0.1:6379> keys kk*
1) "kk1"
2) "kk2"
3) "kk4"

注意 redis事务中有一个异常并不会造成其他命令的回滚!

执行exec命令后发生的异常

对于这种情况,redis中也不会做特别的处理。事务中的命令继续执行

代码语言:javascript
复制
127.0.0.1:6379> set c1 aaa
QUEUED
127.0.0.1:6379> incr c1
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range

不同于关系型数据库,redis中没有回滚操作,官方解释是:

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

Watch

watch命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到exec命令(事务中的命令是在exec之后才执行的,所以在multi命令后可以修改watch监控的键值)。假设我们通过watch命令在事务执行之前监控了多个Keys,倘若在watch之后有任何Key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。

代码语言:javascript
复制
127.0.0.1:6379> set b2 bbb
OK
127.0.0.1:6379> watch b2
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set b2 d111
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> set b3 bbb
OK
127.0.0.1:6379> watch b3
OK
127.0.0.1:6379> set b3 aaaa
OK
127.0.0.1:6379> set b3 avava
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set b3 aaaa
QUEUED
127.0.0.1:6379> exec
(nil)

exec后会自动执行unwatch命令,撤销监控

UnWatch

撤销对一个key的监控

代码语言:javascript
复制
127.0.0.1:6379> set n1 aaa
OK
127.0.0.1:6379> watch n1
OK
127.0.0.1:6379> set n1 bbbb
OK
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set n1 bbbb
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get n1
"bbbb"

~ok 事务到此为止

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年02月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 事务实例
  • 事务异常
    • 进入队列之前发生错误
      • 执行exec命令后发生的异常
      • Watch
      • UnWatch
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档