首页 > 数据库 >11_redis事务

11_redis事务

时间:2024-03-11 19:23:33浏览次数:26  
标签:11 事务 redis MULTI 命令 key 执行

redis事务

数据库事务

所有的数据库操作都必须一次性完成,要么成功,要么失败。

redis事务

可以一次执行多个命令,本质上是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不被其他命令插入,不许加载(不许被不属于该集合的命令插入)

  1. 开启:以MULTI开始一个事务
  2. 入队:将多个命令放到事务队列中,但不会立刻执行
  3. 执行:由EXEC命令触发事务

能干嘛

一个队列中,一次性、顺序性、排他性的执行一系列命令。

用法

常用命令

  • DISCARD: 取消事务,放弃执行事务内的所有命令
  • EXEC: 执行所有事务块内的命令
  • MULTI: 标记一个事务块的开始
  • UNWATCH: 取消WATCH对所有key的监控
  • WATCH key: 监控一个或多个key, 如果在事务执行之前这个key已被其他命令所改动,那么事务将会被打断

正常执行

  • MULTI
  • EXEC

redis事务正常执行

放弃事务

  • MULTI
  • DISCARD

放弃事务

全体连坐(类似于编译错误(语法错误))

在一个命令组中,如果其中的某条命令出现差错,则所有命令都无法成功执行,在最终提交时也是失败的。

全体连坐

冤头债主(类似于运行错误(运行错误))

在一个命令组中,如果其中的某条命令出现差错,则对的命令继续执行,错的命令无法执行。

在redis中,不提供事务回滚的功能,因此开发者必须在事务执行出错后,自行恢复数据库状态。

冤头债主

其余正确的命令仍执行成功

watch监控

redis使用watch来提供乐观锁定,类似于CAS(Check-And-Set)。

  • 悲观锁:顾名思义,也就是很悲哀,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞block,直到它拿到锁。
  • 乐观锁:顾名思义,也就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断在此期间别人有没有去更新这个数据。乐观锁策略:提交版本必须大于当前版本才能执行更新。类似git提交。
  • CAS:redis支持使用CAS的乐观锁。

对于watch,初始化key和balance两个key,先监控在开启multi,保证两key变动在同一个事务内。

image-20240311190349336

如果有加塞篡改,redis在修改的时候会检测数据是否被修改,如果被更改过,则执行失败。

  • 一旦执行了exec操作之前加的监控都会被取消掉了
  • 当客户端连接丢失的时候(比如退出链接),所有东西都会被取消监视。

标签:11,事务,redis,MULTI,命令,key,执行
From: https://www.cnblogs.com/lilyflower/p/18066851

相关文章

  • redis常用命令
    1、启动Redis>redis-server[--port6379]如果命令参数过多,建议通过配置文件来启动Redis。>redis-server[xx/xx/redis.conf]6379是Redis默认端口号。2、连接Redis>./redis-cli[-h127.0.0.1-p6379]3、停止Redis>redis-clishutdown >killredis-pid以上......
  • Spring多线程事务处理
    一、背景本文主要介绍了spring多线程事务的解决方案,心急的小伙伴可以跳过上面的理论介绍分析部分直接看最终解决方案。在我们日常的业务活动中,经常会出现大规模的修改插入操作,比如在3.0的活动赛事创建,涉及到十几张表的插入(一张表可能插入一行或者多行数据),由于单线程模型的关系,......
  • [springboot] SpringBoot启动成功后因actuator健康检测报:Redis health check failed/
    0序背景:项目中引入了spring-boot-starter-actuator健康检测模块<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>1问题描述确认微服务刚启动后,因K8S集群周期性定时(默认每隔1......
  • 基于redis做分布式锁
    1.setnx其实是setkeynx,做分布式锁的问题是担心获取到锁的那个线程还没执行del得时候挂了,key会永久存在,可以给key加上expire,其实就是setnxkeyexxxxnx但如何确定expire多大呢?没法确定,所以一般在expire之前做一个续期操作,用独立线程做2.另一种做法是还是用setnx,如果获取不......
  • Redis 故障转移、高可用方案,都在这了!
    Redis大家都不陌生,就算是没用过,也都听说过了。作为最广泛使用的KV内存数据库之一,在当今的大流量时代,单机模式略显单薄,免不了要有一些拓展的方案。笔者下文会对各种方案进行介绍,并且给出场景,实现等等概述,还会提到一些新手常见的误区。正文先从基础的拓展方式开始,这样更便于理......
  • 3.8~3.11闲话
    3.8因为教师资格证考试所以放假......
  • spring-事务案例
    spring的案例场景同一个事务中使用并发操作导致更新获取锁失败@AutowiredServiceservice1;@TransactionalpublicvoidmethodA(){ List<Object>objs; service1.deleteByid(id1); objs.parallelStream().forEach(o->{ UserEntityusEntity=newUserEntity();......
  • redis自学(15)IO多路复用
     无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案: 如果调用recvfrom时,恰好没有数据,阻塞IO会使进程阻塞,非阻塞IO使CPU空转,都不能充分发挥CPU的作用。 如果调用recvfrom时,恰好有数据,则用户进程可以直接进入第二阶段,读取并......
  • redis安装和运维
    一安装1安装redis单例操作系统:debian121.1在线安装#直接安装,开机自启动aptinstallredis-server#检查安装情况systemctlstatusredis-serversystemctlstartredis-server#启动systemctlstopredis-server#停止systemctlrestartredis-server#......
  • MySQL实现事务隔离的原理
    一、readview四个字段create_trx_id:创建该readview的事务的事务idm_ids:创建readview时,当前数据库中的活跃事务(指启动但还没提交的事务)min_trx_id:m_ids的最小值max_trx_id:创建readview后,下一个事务的id二、聚簇索引的隐藏列trx_id:最近一次改动该聚簇索引记录的事务idrol......