首页 > 数据库 >redis事务是否支持原子性

redis事务是否支持原子性

时间:2024-07-21 23:50:48浏览次数:12  
标签:事务 127.0 错误 0.1 Redis redis 原子 6379

ACID 中关于原子性的定义:

原子性:一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。

Redis事务不支持传统意义上的原子性,但可以通过Lua脚本来实现类似的功能。

事务测试

使用事务可能会遇到以下两种错误:

  • 事务在执行 EXEC 之前,入队的命令可能会出错。比如,命令可能会产生语法错误(参数数量错误,参数名错误等),或者其他更严重的错误,比如内存不足(如果服务器使用 maxmemory 设置了最大内存限制的话)。
  • 命令可能在 EXEC 调用之后失败。比如,事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面,诸如此类。

测试:

  • 第一种情况,语句格式语法错误,命令入队时就出错
127.0.0.1:6379> multi
OK
127.0.0.1:6379> hset test:hash id 10
QUEUED
127.0.0.1:6379> hset test:hash name zhangsan
QUEUED
127.0.0.1:6379> hset test:hash
(error) ERR wrong number of arguments for 'hset' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> hgetall test:hash
(empty list or set)
127.0.0.1:6379>

  可以看到这种情况在最后执行exec命令的时候提示事务错误,而且查看上面的的hash结构并没有设置成功。

  • 第二种情况,命令入队时成功,执行时失败
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 1
QUEUED
127.0.0.1:6379> set b 2
QUEUED
127.0.0.1:6379> set c 3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> get b
"2"
127.0.0.1:6379> get c
"3"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 11
QUEUED
127.0.0.1:6379> lpush b 22 22 33 44
QUEUED
127.0.0.1:6379> set c 33
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get a
"11"
127.0.0.1:6379> get b
"2"
127.0.0.1:6379> get c
"33"

  可以看到“lpush b 22 22 33 44”命令的“set 前后“a 11”、“set c 33”都执行成功了

对于 EXEC 执行之前的错误,Redis 会检查出来并返回错误自动放弃事务;但对于在 EXEC 调用后执行失败的情况,该条语句会执行失败,但事务中的其他命令仍会执行。

因此严格来说,Redis 事务确实不具备原子性的特征。

为什么Redis不支持回滚

如果有使用关系式数据库的经验, 那么 “Redis 在事务失败时不进行回滚,而是继续执行余下的命令”这种做法可能会觉得有点奇怪。

以下是这种做法的优点:

  • Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
  • 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

鉴于没有任何机制能避免程序员自己造成的错误, 并且这类错误通常不会在生产环境中出现, 所以 Redis 选择了更简单、更快速的无回滚方式来处理事务。

Redis的设计哲学与性能考虑

  • 简单与快速:Redis的设计理念是简单且快速。为了实现这一目标,Redis的内部结构被设计得相对简单。如果支持回滚机制,将增加Redis的复杂性和性能损耗,这与Redis的设计哲学不相符合。
  • 避免不必要的开销:在Redis中,命令只会因为错误的语法或类型不匹配而失败,这些错误应该在开发过程中被发现,而不应该出现在生产环境中。因此,Redis选择了不支持回滚来避免不必要的开销。

总结来说,Redis 的事务在 EXEC 调用前出错会取消整个事务,但在 EXEC 调用后,即使某个命令执行失败,事务中的其他命令仍然会继续执行。

标签:事务,127.0,错误,0.1,Redis,redis,原子,6379
From: https://www.cnblogs.com/beatle-go/p/18104499

相关文章

  • 计算机Java项目|基于SpringBoot的高校办公室行政事务管理系统
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与......
  • Redis入门介绍
    目录Redis简介​编辑Redis下载与安装Redis服务启动与停止Redis数据类型字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令在Java中操作RedisRedis的Java客户端SpringDataRedis使用方式 Redis简介Redis是一个基于内存的key-va......
  • # Redis 入门到精通(九)-- 主从复制
    Redis入门到精通(九)--主从复制(1)一、redis主从复制–主从复制简介1、互联网“三高”架构高并发高性能高可用2、你的“Redis”是否高可用?1)单机redis的风险与问题问题1.机器故障现象:硬盘故障、系统崩溃本质:数据丢失,很可能对业务造成灾难性打击结论:基本上会......
  • ThreadLocal 维护数据库连接、事务管理
    即便添加业务,也不能维护原子性,因为每个Dao都有自己的connection因此,我们需要使用ThreadLocal维护一个唯一的Connectionpackagecom.powernode.bank.mvc;importcom.powernode.bank.exceptions.AppException;importcom.powernode.bank.exceptions.MoneyNotEnoughException;......
  • Redis Distributed Lock
    Author:ACatSmilingSince:2024-07-21概述锁的种类:单机版:同一个JVM虚拟机内,使用Synchronized或者Lock接口。分布式:多个不同的JVM虚拟机,单机版的线程锁机制不再起作用,资源类需要在不同的服务器之间共享。Synchronized或者Lock接口,二者都是JVM级别的锁,对于单......
  • Redis缓存面试三兄弟:缓存穿透、缓存雪崩、缓存击穿
    文章目录0.前言1.缓存穿透1.1什么是缓存穿透1.2缓存穿透产生的原因1.2.1恶意攻击1.2.2业务逻辑错误1.3缓存穿透的解决方案1.3.1方案一:参数校验(需要与其它方案结合使用)1.3.2方案二:缓存空值1.3.2.1优点1.3.2.2缺点1.3.3方案三:使用布隆过滤器1.3.3.1什么是布......
  • redis常用命令大全
    以下是一个以表格形式总结的Redis命令概览:命令类别命令描述通用PING查看服务是否运行通用DBSIZE查看当前数据库中key的数目通用SELECTindex切换到指定的数据库通用FLUSHDB清空当前数据库的所有key及其值通用FLUSHALL清空所有数据库的所有key及其值通用QUIT/EXIT退出当前......
  • Redis详解
    Redis(RemoteDictionaryServer)是一种开源的内存数据结构存储系统,作为NoSQL数据库的一种,Redis因其高性能和丰富的数据类型被广泛应用于缓存、会话管理、实时分析等场景。一、Redis简介1.1什么是Redis?Redis是一个开源的、基于内存的数据结构存储系统。它支持多种数据结构,如......
  • Redis7(二)Redis持久化双雄
    持久化之RDBRDB的持久化方式是在指定时间间隔,执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘,也就是Snapshot内存快照,它恢复时再将硬盘快照文件直接读回到内存里面。RDB保存的是dump.rdb文件。自动触发默认redis是有三种自动触发的规则,在配置......
  • idea内置数据库DataGrip + 事务
    --事务的四大特性:--原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败--一致性:事务完成时,必须所有的数据都保持一致性--隔离性:数据库系统提供的隔离机制(在事务未提交commit时,表中数据不变。一般不调整这里)--持久性:事务一段提交或者回归,它对数据库中的数据的改变就是......