前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis事务不支持回滚,你居然还能进行事务控制,牛啊!

Redis事务不支持回滚,你居然还能进行事务控制,牛啊!

原创
作者头像
Java程序猿
修改2021-05-14 14:49:08
9100
修改2021-05-14 14:49:08
举报
文章被收录于专栏:Java核心技术

redis事务

任何数据库都要有一套自己的事务控制机制,redis事务是一次可以执行多个命令,它的本质是一组命令的集合。一个事务中所有的命令都会被序列化,在事务执行的过程中会按照顺序执行队列中的命令。其它客户端提交的命令请求会等到事务执行完毕再执行。

总的来说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令,所以Redis实战笔记你得先看懂!

redis事务和其它数据库事务的区别:

1、redis事务是分为三个阶段:开始事务、命令入队、执行事务。

2、redis事务不具有隔离级别的概念:redis在发送exec命令之前,命令操作只是被放入到队列缓存当中,并不会被实际执行,因此也就不能类似关系型数据中,在事务内查询已经变更的操作,事务外的客户端更不能查询到事务内的数据。

3、redis事务是不保证原子性的:redis事务只保证在命令格式只有在都正确的情况下才会都执行,要不就都不执行命令。但是事务的整体是不保证原子性的,且没有回滚,当事务中任意一个命令执行失败,其余的命令依然会执行。

redis命令语法结构:

1、watch key1 key2等等:监视一个或者多个KEY,如果在事务执行的时候,key的值被其它命令改动,则事务被打断,全部不执行,redis通过该机制完成事务的乐观锁。

2、multi:用于指定redis事务的开始。

3、exec:用于指定redis事务开始执行(顺序、一次性执行所有事务中的命令),一旦执行exec,前面加的监控锁都会被取消。

4、discard:用于取消事务。放弃事务中的所有命令。

5、unwatch:取消对watch中key的监控。


下面我们通过实例来详细分析redis事务的执行过程:

例1、redis正常事务流程:

代码语言:txt
复制
multi
set key1 hello
set key2 free
set key3 world
get key2
exec
redis正常流程
redis正常流程

例2、取消事务,代码如下:

代码语言:txt
复制
multi
set key1 hello_1
set key2 free_1
set key3 world_1
discard
get key3
redis取消事务
redis取消事务

例3、redis事务中某个命令出错(即不存在的命令,不是语法出错)时,事务中的所有命令都不会执行,代码如下:

代码语言:txt
复制
multi
set key1 hello_1
setok key2 free_1
set key3 world_1
get key3
exec

例4、redis事务中存在某个命令具有语法性错误,执行exec时,其它命令照样执行,代码如下:

代码语言:txt
复制
multi
incr key1 
set key2 free_1
set key3 world_1
get key3
exec

例5、利用watch监控某个key值的变化,来做redis事务的乐观锁。模拟keya账户中有100块钱,keyb账户有20块钱,然后a向b转了50块钱。

首先添加测试数据,代码如下:

代码语言:txt
复制
set keya 100
set keyb 20 
watch keya 
multi
decrby keya 50
incrby keyb 50
exec 
get keya 
redis watch
redis watch

然后,我们打开第二个客户端,在事务执行(exec)之前,对a账户提前减少50块钱,看下watch的乐观锁机制是否生效,代码如下:

redis watch
redis watch

在redis事务提交时,如果在事务进入缓存队列的过程中,watch命令监控key的值发生了变化,则事务中的命令将都不会被执行。同时返回<nil>提示事务使用者事务执行失败。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • redis事务
  • redis事务和其它数据库事务的区别:
  • redis命令语法结构:
    • 例1、redis正常事务流程:
      • 例2、取消事务,代码如下:
        • 例3、redis事务中某个命令出错(即不存在的命令,不是语法出错)时,事务中的所有命令都不会执行,代码如下:
          • 例4、redis事务中存在某个命令具有语法性错误,执行exec时,其它命令照样执行,代码如下:
            • 例5、利用watch监控某个key值的变化,来做redis事务的乐观锁。模拟keya账户中有100块钱,keyb账户有20块钱,然后a向b转了50块钱。
            相关产品与服务
            云数据库 Redis®
            腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档