首页 > 其他分享 >#yyds干货盘点#Spring事务回滚的两种方法

#yyds干货盘点#Spring事务回滚的两种方法

时间:2023-04-15 10:36:22浏览次数:32  
标签:yyds 回滚 Spring 事务 方法 public def transactionManager

Spring事务回滚的前提是你当前使用的数据库必须支持事务,比如MySQL的Innodb是支持的,但Mysaim则是不支持事务的。

方法一

使用 @Transaction 来配置自动回滚,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的,也就是被已经被注入的类,而不是new出来的类。

若配置在方法上,则该方法被加上了事务
若配置在类上,则等于给该类的所有方法都加上了该注解。此时如果在该类下的某个方法也加了 @Transaction ,则该方法使用自己的配置,其他方法使用类上的配置。

@Service
@Transactional
public class UserServiceImpl implements UserService {
  @Override
  public void save(User user) {
      //some code
      //db operation
  }
}

若被配置的方法或类抛出了异常,则事务会被自动回滚,除非你在该方法中手动捕获了异常,且没有抛出新的异常。

可以使用 @Transactional(rollbackFor = Exception.class) 来设定针对特定的异常进行事务回滚,如果不设置则默认会回滚 RuntimeException and Error (参考自源码内文档)。

@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
  @Resource
  private UserMapper userMapper;

  @Override
  public void save(User user) {
      userMapper.insert(user);
      throw new RuntimeException(); // 抛出异常,事务回滚,上面的insert插入失败。
  }
}

方法二
通过注入 DataSourceTransactionManager 来手动开启事务,手动回滚事务,用于抛出异常被catch后,进行手动回滚,可控程度更高,可以更灵活的使用。

先注入 DataSourceTransactionManager 事务管理对象
new 一个 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 对象
使用 TransactionStatus status = transactionManager.getTransaction(def);来开启一个事务,
使用 transactionManager.rollback(status); 来回滚这个事务
使用 transactionManager.commit(status); 来提交这个事务

@Service
public class UserServiceImpl implements UserService {
@Autowired
private DataSourceTransactionManager transactionManager;
  @Override
  @Transactional
  public void save(User user) {

     DefaultTransactionDefinition def = new DefaultTransactionDefinition();
     // explicitly setting the transaction name is something that can only be done programmatically
     def.setName("SomeTxName");
     def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

     TransactionStatus status = transactionManager.getTransaction(def);
     try {
         // execute your business logic here
         //db operation
     } catch (Exception ex) {
         transactionManager.rollback(status);
         throw ex;
     }
  }
}

标签:yyds,回滚,Spring,事务,方法,public,def,transactionManager
From: https://blog.51cto.com/u_11365839/6192226

相关文章

  • springboot连接不同数据库的写法
    MySQL当url连接不指定/数据库名可以访问到mysql服务器上有权限的任何库,但是所有sql需要加上库名前缀.pom<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>配置spring:datasource:driver-class-n......
  • SpringBoot 集成 MybatisPlus 九——逻辑删除
    1逻辑删除的概念逻辑删除不会在数据库中删除数据,只是通过一个字段用来标识被删除的记录,数据仍然保存在数据库中。在实际的工作当中,因为数据非常重要,为了防止因用户误操作删除数据后无法恢复的问题,我们通常不会对数据做物理删除,即将数据从数据库中直接删除。而是多采用逻辑删除的方......
  • #yyds干货盘点#dB、dBm、dBi、dBc,一文带你学习无线信号强度指标
    定义与由来dB是一个比值,是一个纯计数方法,没有任何单位标注,那它具有什么存在的意义呢。在无线通信里,常常用它来衡量一个地点的信号质量强度。为了纪念贝尔,所以采用贝尔的名字来对信号的衰减或增强进行命名,其表示为Bel=Log(输入信号的功率/输出信号的功率),在实际使用中这个单位太大,所......
  • #yyds干货盘点#Linux之find:查找目录下的文件
    【功能说明】find命令用于查找目录下的文件,同时也可以调用其他命令执行相应的操作。【语法格式】find[-H][-L][-P][-Ddebugopts][-olevel][pathname][expression]find[选项][路径][操作语句]1)注意find命令以及后面的选项和路径、操作语句,每个......
  • #yyds干货盘点# LeetCode程序员面试金典:K 个一组翻转链表
    题目:给你链表的头节点head,每 k 个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例1:输入:head=[1,......
  • #yyds干货盘点# LeetCode面试题:最小覆盖子串
    1.简述:给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。 注意:对于t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。如果s中存在这样的子串,我们保证它是唯一的答案。......
  • SpringSecurity过滤器-CsrfFilter
    CsrfFilter是为了防御CSRF攻击的。CSRF攻击请参考松哥手把手教你在SpringBoot中防御CSRF攻击!soeasy!。CsrfFilter的源码在要学就学透彻!SpringSecurity中CSRF防御源码解析说的很清楚了。 在这里是对LazyCsrfTokenRepository的使用做个总结。 CsrfFilter#doFilterI......
  • SpringBoot常用注解
    本文整理了SpringBoot常用注解,主要讲解这些注解的用法,并附上一致思维导图。SpringBoot常用注解组件相关注解@Controller用于修饰MVC中controller层的组件,SpringBoot中的组件扫描功能会识别到该注解,并为修饰的类实例化对象,通常与@RequestMapping联用,当SpringMVC获取到请求时......
  • 解决Spring Boot jar包启动日志输出中文乱码
    在使用slf4j做日志输出时,打jar包运行后,会出现中文乱码问题,只需要将logback-spring.xml配置文件中的<charset>标签注释即可,如图:  解释: 如果不配置logback-spring.xml或resource文件夹下没有logback-spring.xml文件,则springboot使用默认的配置,那么部署jar包,java-jarxxx.......
  • Spring很常用的@Conditional注解的使用场景和源码解析
    你好,我是刘牌!介绍今天要分享的是Spring的注解@Conditional,@Conditional是一个条件注解,它的作用是判断Bean是否满足条件,如果满足条件,则将Bean注册进IOC中,如果不满足条件,则不进行注册,这个注解在SpringBoot中衍生出很多注解,比如@ConditionalOnProperty,@ConditionalOnBean,@Conditi......