Redis支持事务吗,有说支持的,有说半支持的,我这里进行一波演示,看看到底支持不支持。在演示事务之前,首先要了解一下这几个命令。
multi开启事务
exec执行事务
discard取消事务
watch key [key ...]监视事务
unwatch取消监视事务
下面通过一个转账的例子进行演示事务。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> get money
QUEUED
127.0.0.1:6379> exec
1) OK
2) "100"

这是一个正常的事务问题,就是开启了一个事务,事务里有一组数据,然后执行,这里的每一条指令都是放到一个队列里的,当执行的时候,会逐条执行。
下面演示一个取消事务的

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> get money
QUEUED
127.0.0.1:6379> discard
OK

这个也是正常的取消了
如果在我们执行事务的时候,出现了语法错误,那么整个事务都不会被执行了

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> sett age 20
(error) ERR unknown command `sett`, with args beginning with: `age`, `20`,
127.0.0.1:6379> get money
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

可以看出,当出现语法错误的时候,整个事务都不会被执行,还有一种错误,不是语法错误,而是运行时错误。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name "hzy"
QUEUED
127.0.0.1:6379> incr name
QUEUED
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) "hzy"

我们让一个字符串自增,出现了错误,但是事务的其他语句还是正常执行了(这应该就是别人说的Redis是半支持事务吧)。
还有一种情况就是,当我们执行事务的时候,还未执行exec,然后有其他客户端来干扰了。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> incr money
QUEUED
127.0.0.1:6379> exec
1) OK
2) (integer) 101

如果在执行exec之前,另一个客户端执行了如下操作

127.0.0.1:6379> set money 500
OK

然后客户端1再执行exec,我们get一下

127.0.0.1:6379> get money
"101"

可以看出,这是事务执行完的结果,而那个500就没有成功,为了解决这一问题,出现了锁,用watch监视,也就是我们的乐观锁。

127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> incr money
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get money
"500"

这里我们对money进行了监视,在执行exec之前我们在客户端2执行如下

127.0.0.1:6379> set money 500
OK

然后再执行exec,由于对money进行了watch监视,所以就返回了nil。当我们再get money的时候,此时就是刚刚设置的500了,而事务相当于没有执行。
这里需要注意,当我们执行了exec、discard或unwatch的时候,都会自动的取消监视。

学了这么久的Redis,竟然还不知道事务相关推荐

  1. 学了这么久UI,你还不知道UI设计界面包含哪些?

    为了建立有效的UI,设计师需要深入的了解移动端APP的特性,了解他们的组成部分和功能.现如今随着移动行业的快速发展,很难给所有的APP建立一个统一的界面标准.先就和南京学码思UI培训机构一起来看下吧! ...

  2. 别人都知道的法线贴图流程,你竟然还不知道?真不知道你怎么学的

    一.法线贴图是什么?能做什么? 今天我们讲讲法线贴图,首先从名字就能看出它是一张贴图,像漫反射贴图,置换贴图,高光贴图,AO贴图,不透明图贴图,自发光贴图等等是一样的,将它赋予一个模型便会产生相应的效 ...

  3. 你竟然还不知道电脑上的F1-F12快捷键的作用

    你竟然还不知道电脑上的F1-F12快捷键的作用 我们常将F1-F12称为功能键,在这些功能键中除了F5在刷新时常用时,大家很少使用其他功能键.快捷键目的是提高效率,"快"指的是速度 ...

  4. 仅使用python基本语法、即不使用任何模块、编写_微博可以设置“仅半年内可见”!你竟然还不知道???...

    原标题:微博可以设置"仅半年内可见"!你竟然还不知道??? 主编乱弹妞:两枚少女心爆棚的"女汉子",爱吃会耍又可爱,卖得了萌,犯得了二,自诩追得上陈伟霆,嫁得了 ...

  5. 微信小程序 手写签名_你竟然还不知道在微信上就可以手写签名、签文件了~

    原标题:你竟然还不知道在微信上就可以手写签名.签文件了~ 你是否遇到以下问题: 正在休假却收到公司的夺命连环call,说有重要文件需要你签字确认? 正在上班,却有孩子学校.小区.甚至居委会各种需要通知 ...

  6. 国内最大.NET平台重金招募中 你竟然还不知道?

    各位路过的 捎带眼瞅见的 不小心翻到的 英雄好汉 请留步~ 让小编来带你康康 这个胆敢号称 国内最大的.NET的平台 到底有何惊人之处 一 难道是因为它有--"最敢"的生态开放平台 ...

  7. 还不知道事务消息吗?这篇文章带你全面扫盲

    目录 为什么需要事务消息? 事务消息 事务消息使用注意点 彩蛋 在分布式系统中,为了保证数据一致性是必须使用分布式事务.分布式事务实现方式就很多种,今天主要介绍一下使用 RocketMQ 事务消息,实 ...

  8. 学了这么久MySQL竟然还不知道视图和触发器!!!

    文章目录 create简介 视图 触发器 create简介 说真的,第一次听说视图的时候,我想起的是图形化管理工具.你可能直到创建数据库用create database 数据库名,你也可能知道创建表用 ...

  9. 方向盘左右能摇动_学车这么久了,你还不会打方向盘呢?

    刚刚学车的朋友肯定有过这样的问题: 教练说:往左打两圈,往右打一圈,往左打半圈--你乖乖听话照做,然后教练说:回正吧. 是不是一下就蒙住了??我刚才打几圈来着??往哪边转是回正啊?? 我们知道方向盘上 ...

最新文章

  1. android 云应用开发,Android云应用开发:网络通信技术介绍
  2. Netflix Play API:我们为什么构建了一个演进式架构?
  3. Mutex和上厕所居然有这么多异曲同工之妙
  4. oracle非延迟约束,Oracle可延迟约束Deferable的使用
  5. MATLAB随机数生成器
  6. C# Newtonsoft.Json用法
  7. PCS7 DCS 水泥粉磨程序
  8. 解除诺顿企业版的 liveupdate 旁边小锁,解除限制 手动 更新诺顿的方法
  9. Hbase+JAVAWeb实现超市仓库管理系统
  10. 推理和论证(证明)的区别
  11. 未转变者服务器.id大全,Unturned未转变者Elver最新地图ID汇总 2021最新版ID大全[多图]...
  12. 如何使用Pandas进行数据分析!最详细的数据分析教程!
  13. codeforces1438C Engineer Artem
  14. Redis之EXPIRE
  15. redis的主从同步及高可用集群
  16. 神经网络调参-warmup and decay
  17. oracle内存管理模式amm,Oracle 11g自动内存管理(AMM)相关的初始化参数
  18. Linux/Android下的虚拟声卡
  19. Knowledge representation learning with entity descriptions,hierarchical types, and textual relation
  20. STM8学习笔记3 STM8简介

热门文章

  1. Oracle SQL 对象的命令和编写规范
  2. (1)安装----anaconda3下配置pyspark【单机】
  3. java 多线程 day06 threadLocal
  4. SDAutoLayout 一行代码搞定自动布局
  5. 进程的一生@unix
  6. 无缝的缓存读取:双存储缓存策略
  7. https的ssl证书申请及服务器的nginx的配置教程
  8. 彻底解决Eclipse的控制台console按钮非常小
  9. 如何使用txt文件实现JMeter参数化
  10. 靠谱测试人员需具备业务分析能力