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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: Redis之坑:Redis与MySQL中事务的区别 Note: 该篇讨论的只是Redis与MySQL中事务的区别,并不能统一代表NO-SQL与关系型SQL; 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务; 事务使用的目的 是统一管理 insert,update,delete, 这些write操作,以此来维护数据完整性。

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

Note:

  1. 该篇讨论的只是Redis与MySQL中事务的区别,并不能统一代表NO-SQL与关系型SQL;
  2. 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务;
  3. 事务使用的目的 是统一管理 insert,update,delete, 这些write操作,以此来维护数据完整性。所以下文讨论的所有sql语句都是write操作

事务命令

MySQL:

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

Redis:

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

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


默认状态

MySQL:

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

Redis:

  • Redis默认不会开启事务,即command会立即执行,而不会排队。并不支持Rollback(详情可见:Redis之坑:理解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);
    AI 代码解读

    所以,上述代码,insertSelective 将会被立即赋值(无论是否开启事务):

    insertSelective = 受影响的行数;
    AI 代码解读

Redis:

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

    上述代码,

    • 如果没有开启事务,操作被立即执行,a 将会被立即赋值(true|false);
    • 如果开启事务,操作未被立即之行,将会返回NULL值,而a的类型是boolean,所以将会抛出异常:
      java.lang.NullPointerException
  • 原文地址http://www.bieryun.com/3334.html
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
MySQL底层概述—9.ACID与事务
本文介绍了数据库事务的ACID特性(原子性、一致性、隔离性、持久性),以及事务控制的演进过程,包括排队、排它锁、读写锁和MVCC(多版本并发控制)。文章详细解释了每个特性的含义及其在MySQL中的实现方式,并探讨了事务隔离级别的类型及其实现机制。重点内容包括:ACID特性(原子性、持久性、隔离性和一致性的定义及其实现方式)、事务控制演进(从简单的全局排队到复杂的MVCC,逐步提升并发性能)、MVCC机制(通过undo log多版本链和Read View实现高效并发控制)、事务隔离级别(析了四种隔离级别(读未提交、读已提交、可重复读、可串行化)的特点及适用场景)、隔离级别与锁的关系。
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
MySQL 和 Oracle 的区别?
本文对比了Oracle和MySQL数据库的多个方面。Oracle适用于大型数据库,支持高并发和大访问量,市场占有率为40%,安装占用空间较大,约3G;而MySQL适合中小型应用,是开源免费的,安装仅需152M。两者在主键生成、字符串处理、SQL语句、事务处理等方面存在差异。Oracle功能更为强大,尤其在企业级应用中表现突出,而MySQL则以简单易用见长。
142 7
MySQL 和 Oracle 的区别?
MYSQL支持的存储引擎有哪些, 有什么区别
MYSQL存储引擎有很多, 常用的就二种 : MyISAM和InnerDB , 者两种存储引擎的区别 ; ● MyISAM支持256TB的数据存储 , InnerDB只支持64TB的数据存储 ● MyISAM 不支持事务 , InnerDB支持事务 ● MyISAM 不支持外键 , InnerDB支持外键
Redis与MySQL的数据一致性
在高并发环境下,保持 Redis 和 MySQL 的数据一致性是一个复杂但重要的问题。通过采用读写穿透、写穿透、分布式锁、双写一致性保障和延时双删策略,可以有效地减少数据不一致的风险,确保系统的稳定性和可靠性。通过合理的缓存策略和数据同步机制,可以显著提升系统的性能和用户体验。
148 22
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
145 7
MySQL事务日志-Undo Log工作原理分析
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
161 14

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等