首页 > 其他分享 >Spring事务回滚的两种方法

Spring事务回滚的两种方法

时间:2022-10-30 13:04:41浏览次数:44  
标签:回滚 Spring 事务 new 方法 def transactionManager

##方法一

1.使用 @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;
}
}
} // 此代码案例来自Alibaba Coding Guidelines

标签:回滚,Spring,事务,new,方法,def,transactionManager
From: https://blog.51cto.com/u_15773567/5807493

相关文章

  • Spring源码分析之AOP
    AOP是什么面向切面的程序设计(Aspect-orientedprogramming,AOP,又译作面向方面的程序设计、剖面导向程序设计),是计算机科学中的一种程序设计思想,旨在将横切关注点与业务主体进......
  • SpringMVC源码-DispatcherServlet初始化
    web容器启动后会实例化Servlet,会执行Servlet的init方法且只会执行一次。后续调用doService处理客户请求。DispatcherServlet的构造方法publicDispatcherServlet(){ su......
  • 第四章 SpringBoot 底层机制
    搭建SpringBoot底层机制开发环境1、创建Maven项目lzw-springboot2、导入相关依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.o......
  • 事务支持与全局异常
    在使用]dbc作为数据库访问技术时,SpringBoot框架定义了基于jdbc的PlatformTransactionManager接口的实现DataSourceTransactionManager,并在SpringBoot应用启动时自动进......
  • Springboot centos7 启动
     1、java-jardemo.jar说明:用这种方法启动后,不能继续执行其它命令了,如果想要继续执行其它命令,就都打断,打断一般用ctrl+c。2、java-jardemo.jar&第2种在第1种方式的基础......
  • 「MySQL高级篇」MySQL日志、事务原理 -- undolog、redolog、binlog、两阶段提交
    引言日志日志,在我们平时开发中主要的用途在于监控、备份,但在MySQL中,日志的功能远远不止这些,分别有用于记录的慢查询日志,回滚版本的undolog,宕机恢复的redolog、全量备份的bin......
  • SpringBoot3.x原生镜像-Native Image尝鲜
    前提Spring团队致力于为Spring应用程序提供原生映像支持已经有一段时间了。在SpringBoo2.x的SpringNative实验项目中酝酿了3年多之后,随着SpringFramework6和SpringBoo......
  • SpringBoot(三) - Ribbon客户端负载均衡,Zuul网关,Config配置中心
    1、Ribbon客户端负载均衡1.1依赖1.2配置信息#feign默认加载了ribbon负载均衡,默认负载均衡机制是:轮询#负载均衡机制是添加在消费端(客户端)的,如果改为随机,指定服务名......
  • spring-messaging
    概述Spring框架作为Java开源世界的集大成者,spring-messaging模块为集成messagingapi和消息协议提供支持。其代码结构为:包括base、converter、core、handler、simp、support......
  • springBoot
    入门案例:直接开发控制器的类: 4.运行自带的带有main方法的类  SpringBoot能运行的原因是,在pom里面继承了一个依赖,父类里面有很多依赖,还有一个启动依赖,里......