SpringBoot中使用redis事务

您所在的位置:网站首页 redis怎么做到事务回滚 SpringBoot中使用redis事务

SpringBoot中使用redis事务

2024-07-18 08:00:34| 来源: 网络整理| 查看: 265

本文基于SpringBoot 2.X 事务在关系型数据库的开发中经常用到,其实非关系型数据库,比如redis也有对事务的支持,本文主要探讨在SpringBoot中如何使用redis事务。 事务的相关介绍可以参考:

0、起因

在一次线上事故中,我们定位到redis的使用存在大value,超过了dubbo的最大数据量限制,于是紧急将这个大的对象value拆分成单个的string value。 为了保持数据库和redis双写一致,在对数据库进行更新,删除,插入操作时,要从redis删除指定的key。 一切都是使用redis的常规操作,但雷就埋在其中一个数据库的update方法里,这个方法上开启了事务@Transactional,导致里面的删除redis key操作也加入了事务。 上线后出现报错:

这个报错明确指出,集群模式的redis不支持事务。集群不支持事务的原因可参考此文:Is there any Redis client (Java prefered) which supports transactions on Redis cluster? 基于此次问题,总结出本文内容

1、Spring中的事务

所有数据访问技术都有事务机制,这些技术提供了API来开启事务、提交事务完成数据操作, 或者在发生错误的时候回滚数据。 Spring采用统一的机制来处理不同的数据访问技术的事务, Spring的事务提供一个PlatformTransactionManager的接口,不同的数据访问技术使用不同的接口实现。

数据访问技术实现JDBCDataSourceTransactionManagerJPAJPATransactionManagerHibernateHibernateTransactionManagerJDOJDOTransactionManager分布式事务JtaTransactionManager

在SpringBoot中开启事务非常简单,只需要在方法或类上使用注解@Transactional即可。 Spring官方文档中还要求使用@EnableTransactionManagement 开启事务,但SpringBoot通过自动配置已经帮我们做了,所以SpringBoot中不用写该注解 这里重点讲下@Transactional注解的几个常用属性

propagation

事务的传播机制,主要有以下几种,默认是REQUIRED:

REQUIRED - 方法A调用时候没有事务新建一个事务,在方法A中调用方法B,将使用相同的事务,如果方法B发生异常需要回滚,整个事务回滚。

REQUIRES_NEW - 方法A调用方法B时,无论是否存在事务都开启一个新事务,这样B方法异常不会导致A的数据回滚。

NESTED - 和REQUIRES_NEW类似,但是只支持JDBC,不支持JPA或Hibernate

SUPPORTS - 方法调用时有事务就用事务,没事务就不用事务

NOT_SUPPORTED - 强制方法不在事务中执行,若有事务,在方法调用到结束阶段先挂起事务。

NEVER - 强制不能有事务,若有事务就抛出异常

MANDATORY - 强制必须有事务,如果没有事务就抛出异常

rollbackFor

指定哪些异常可以导致事务回滚,默认是Throwable的子类

noRollbackFor

执行哪些异常不可用引起事务回滚,默认是Throwable的子类

2、@Transactional事务失效的情况 只对public方法生效。默认的protected和private方法上写上@Transactional不会报错,但该方法上的事务不生效,官方原文:Method visibility and @Transactional;默认情况(只写@Transactional不填写rollbackFor参数)下此注解会对unchecked异常进行回滚,对checked异常不回滚;类内部未开启事务的方法调用开启事务的方法 前两条很好理解,针对3,引用丁雪丰的《Spring全家桶》视频中的解释:

Spring的声明式事务本质上是通过AOP来增强了类的功能Spring的AOP本质上就是为类做了一个代理

看似在调用自己写的类,实际用的是增强后的代理类

下图描述了方法被事务代理时的流程,来源:Spring AOP

3、SpringBoot整合Redis事务实践

下面我们搭建一个最简单的SpringBoot整合redis的工程用代码来验证redis事务

SpringBoot整合Redis

SpringBoot整合redis使用的是spring-boot-starter-data-redis,redis事务依赖于jdbc的事务管理,所以还需要引入jdbc pom相关引入:

org.springframework.boot spring-boot-starter-jdbc com.h2database h2 runtime 开启Redis事务

编写redis配置类,开启redis事务,配置事务管理

@Configuration public class RedisConfig { @Bean public StringRedisTemplate StringRedisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); /** * description 开启redis事务(仅支持单机,不支持cluster) **/ template.setEnableTransactionSupport(true); return template; } /** * description 配置事务管理器 **/ @Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ return new DataSourceTransactionManager(dataSource); } } 代码验证

针对本文讨论,设计了四个验证方法,可自行验证

/** * description 不带事务set * return java.lang.String * author 郑晓龙 * createTime 2019/12/12 16:36 **/ @GetMapping("put") public void put(String key, String value) { redisService.put(key, value); } /** * description 带事务set * return java.lang.String * author 郑晓龙 * createTime 2019/12/12 16:36 **/ @GetMapping("putWithTx") public void putWithTx(String key, String value) { redisService.putWithTx(key, value); } /** * description 调用带事务方法不生效的情况 * return java.lang.String * author 郑晓龙 * createTime 2019/12/12 16:36 **/ @GetMapping("invokeWithPutTx") public void invokeWithPutTx(String key, String value) { redisService.invokePutWithTx(key, value); } /** * description 调用带事务方法生效的情况 * return java.lang.String * author 郑晓龙 * createTime 2019/12/12 16:36 **/ @GetMapping("invokeWithPutTx2") public void invokeWithPutTx2(String key, String value) { redisService.invokePutWithTx2(key, value); } 4、总结: redis事务只支持单机,不支持cluster需要开启事务时,只需要在对应的方法或类上使用@Transactional注解即可,SpringBoot自动开启了@EnableTransactionManagement需要注意事务不生效的几种情况redis事务依赖于jdbc的事务管理 5、示例代码及参考:

示例代码: redis-transaction

Transaction ManagementTransaction PropagationTransactional Support《Spring全家桶》丁雪丰


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


    图片新闻

    实验室药品柜的特性有哪些
    实验室药品柜是实验室家具的重要组成部分之一,主要
    小学科学实验中有哪些教学
    计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
    实验室各种仪器原理动图讲
    1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
    高中化学常见仪器及实验装
    1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
    微生物操作主要设备和器具
    今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
    浅谈通风柜使用基本常识
     众所周知,通风柜功能中最主要的就是排气功能。在

    专题文章

      CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭