Redis事务与MySQL事务的区别

本文探讨了Redis和MySQL在事务处理上的差异。MySQL默认开启事务,支持Begin、Commit、Rollback操作,而Redis则需显式使用Multi、Exec、Discard,并不支持回滚。MySQL基于undo/redo日志实现事务,而Redis则通过命令队列实现,不立即执行事务内的命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务命令

mysql:

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

redis:

  • Multi:标记事务的开始
  • Exec:执行事务的commands队列
  • Discard:结束事务,并清除commands队列

默认状态

mysql:

  • mysql会默认开启一个事务,且缺省设置是自动提交,即每成功执行一次sql,一个事务就会马上commit,所以不能rollback

redis:

  • redis默认不会开启事务,即command会立即执行,而不会排队,并不支持rollback

使用方式

mysql(包含两种方式):

  1. 用Begin、Rollback、commit显式开启并控制一个 新的 Transaction
  2. 执行命令 set autocommit=0,用来禁止当前会话自动commit,控制 默认开启的事务

redis:

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

实现原理

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)自身实现)。调用exec才会执行commands队列
boolean a = redisTemplate.opsForZSet().add("generalService",orderId,System.currentTimeMillis());

上述代码,

  • 如果没有开启事务,操作被立即执行,a将会被立即赋值(true/false)
  • 如果开启事务,操作不会被立即执行,将会返回null值,而a的类型是boolean,所以将会抛出异常:java.lang.NullPointerException
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值