Redis之坑:Redis与MySQL中事务的区别

2023-11-20

Redis之坑:spring-data-redis中的Redis事务
Redis之坑:理解Redis事务
Redis之坑:Redis与MySQL中事务的区别
Transaction之坑:数据库事务
Transaction之坑:Spring中配置Transaction与不配置有何区别
Transaction之坑:分析sql执行结果,主动促使事务rollback


Note:

  1. 该篇讨论的只是Redis与MySQL中事务的区别,并不能统一代表NO-SQL与关系型SQL;
  2. 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务;

事务命令

MySQL:

  • BEGIN:显式地开启一个事务;
  • COMMIT:提交事务,将对数据库进行的所有修改变成为永久性的;
  • ROLLBACK:结束用户的事务,并撤销正在进行的所有未提交的修改;

Redis:

  • MULTI:标记事务的开始;
  • EXEC:执行事务的commands队列;
  • DISCARD:结束事务,并清除commands队列;

Redis之坑:理解Redis事务 中我们通过类比MySQL的BEGAIN,COMMIT,ROLLBACK来理解Redis的事务命令。但是显然,它们有着本质区别。


默认状态

MySQL:

  • MySQL会默认开启一个事务,且缺省设置是自动提交,即,每成功执行一个SQL,一个事务就会马上 COMMIT。所以不能Rollback。

Redis:


使用方式

MySQL: 包含两种

  1. 用 BEGIN, ROLLBACK, COMMIT,显式开启并控制一个 新的 Transaction。
  2. 执行命令SET AUTOCOMMIT=0,用来禁止当前会话自动commit,控制 默认开启的事务

Redis:

  1. 用 MULTI, EXEC, DISCARD,显式开启并控制一个Transaction(注意:这里没有强调 “新的” ,因为默认是不会开启事务的)。

实现原理

很容易理解,Redis与MySQL中事务的区别其根本原因就是实现不同方式造成的。

MySQL:

  • MySQL实现事务,是基于UNDO/REDO日志
    • UNDO日志记录修改前状态,ROLLBACK基于UNDO日志实现;
    • REDO日志记录修改后的状态 ,COMMIT基于REDO日志实现;
    • 在MySQL中无论是否开启事务,SQL都会被立即执行并返回执行结果。只是 事务开启执行后的状态只是记录在REDO日志,执行COMMIT之后,数据才会被写入磁盘
int insertSelective = serviceOrderMapper.insertSelective(s);

所以,上述代码,insertSelective 将会被立即赋值(无论是否开启事务,只是结果或未被写入磁盘):

insertSelective = 受影响的行数;

Redis:

  • Redis实现事务,是基于COMMANDS队列
    • 如果没有开启事务,command将会被立即执行并返回执行结果,并且直接保存在内存中
    • 如果事务开启,command不会被立即执行,而是排入队列并返回排队状态(具体依赖于客户端(例如:spring-data-redis)自身实现)。调用EXCE才会执行COMMANDS队列
boolean a = redisTemplate.opsForZSet().add("generalService",orderId,System.currentTimeMillis());

上述代码,

  • 如果没有开启事务,操作被立即执行,a 将会被立即赋值(true|false);
  • 如果开启事务,操作未被立即执行,将会返回NULL值,而a的类型是boolean,所以将会抛出异常:
    java.lang.NullPointerException
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis之坑:Redis与MySQL中事务的区别 的相关文章

  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 如何在 phpmyadmin 中创建 MySQL 触发器

    我想在 MySQL 中创建一个触发器 我运行以下命令 mysql gt delimiter mysql gt CREATE TRIGGER before insert money BEFORE INSERT ON money gt FOR
  • 显示表 FULLTEXT 索引列

    我希望运行一个查询 该查询将返回表中全文索引的列列表 该表采用 MyISAM 格式 我将使用 php 来构建查询 理想情况下 我会运行查询 它会返回信息 以便我可以构造一个以逗号分隔的列字符串 例如 名 姓 电子邮箱 这在 MySQL 中可
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PDO PHP 连接,致命错误

    我的连接类 firstcode php class DB functions public db function construct try db new PDO mysql localhost dbname xxx charset ut
  • 为什么Redis SET性能优于GET?

    根据Redis基准 http redis io topics benchmarkss Redis 可以执行 100 000 SET 操作 秒和 80 000 GET 操作 秒 Redis 是一种内存数据库 这似乎令人惊讶 因为通常人们会认为
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希

随机推荐