Spring事务回滚的两种方法

标签: spring 方法 | 发表时间:2022-10-29 14:32 | 作者:阿杆
出处:https://juejin.cn/backend

theme: Chinese-red

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天, 点击查看活动详情


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

方法一

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

    • 若配置在方法上,则该方法被加上了事务
    • 若配置在类上,则等于给该类的所有方法都加上了该注解。此时如果在该类下的某个方法也加了 @Transaction ,则该方法使用自己的配置,其他方法使用类上的配置。
        @Service
    @Transactional
    public class UserServiceImpl implements UserService {
        @Override
        public void save(User user) {
            //some code
            //db operation
        }
    }
    
  2. 若被配置的方法或类抛出了异常,则事务会被自动回滚,除非你在该方法中手动捕获了异常,且没有抛出新的异常。

    可以使用 @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后,进行手动回滚,可控程度更高,可以更灵活的使用。

  1. 先注入 DataSourceTransactionManager 事务管理对象
  2. new 一个 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 对象
  3. 使用 TransactionStatus status = transactionManager.getTransaction(def);来开启一个事务,
  4. 使用 transactionManager.rollback(status); 来回滚这个事务
  5. 使用 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 方法] 推荐:

spring与mybatis四种整合方法

- - 企业架构 - ITeye博客
  1、采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数.   (1)Spring配置文件:.      .       .       .

Spring MVC HTTP Status 406 - 解决方法

- - 行业应用 - ITeye博客
字面意思很明显,产生的格式跟能接受的格式不符,对不上眼. 但是各种google、stackoverflow之后,大多数答案都只是说要加上json的相关依赖之类的,试了都无用. 而另一个HeaderContentNegotiationStrategy根本没发挥作用.   在spring-servelt中添加.

Spring事务回滚的两种方法

- - 掘金 后端
这是我参与「掘金日新计划 · 10 月更文挑战」的第30天, 点击查看活动详情. 当然,Spring事务回滚的前提是你当前使用的数据库必须支持事务,比如MySQL的Innodb是支持的,但Mysaim则是不支持事务的. @Transaction 来配置自动回滚,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的,也就是被已经被注入的类,而不是new出来的类.

spring 中配置定时调度两种方法介绍

- - CSDN博客综合推荐文章
直接用jdk api的Timer类,无需配置spring文件. 1、用@compent注解,实现InitializingBean接口 ,spirng会自动去查找afterPropertiesSet()方法,. 2、在afterPropertiesSet方法中写业务实现,调用timer的schedule方法或者.

【spring】springmvc接收请求参数的方法

- - 开源软件 - ITeye博客
     控制器的请求处理方法的签名可以将任何事物作为参数,我们可以将HttpServletRequest、HttpServletResponse、 String或者数字参数传递进来,这些参数可以对应请求中的查询参数、cookie值、HTTP请求头的值或其他一些可能的选项. 使用@RequestParam绑定请求参数值.

Spring配置文件location的几种设置方法

- - ITeye博客
1.默认location 默认会去加载WEB-INF下的applicationContext.xml文件,如果该文件不存在,则会抛出以下的异常. web.xml中通过servlet name自定义. 通过以下的定义,会去加载WEB-INF下面的test-servlet.xml作为spring的配置文件.

基于 Annotation 拦截的 Spring AOP 权限验证方法

- - 企业架构 - ITeye博客
转自: http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/index.html. 使用 Annotation 可以非常方便的根据用户的不同角色,分配访问 Java 方法的权限. 在 Java Web 开发中,使用这种方法,可以提高系统的松耦合度,方便维护.

Spring的WebServiceTemplate访问WebService的方法及其本质原理

- - 行业应用 - ITeye博客
WebService客户端调用的本质就是将SAOP格式的XML通过通信协议发送到WebService的服务器端,然后接收服务器端返回的XML.. 本文简单介绍一下如何通过Spring提供的WebServiceTemplate访问 Webservice,WebServiceTemplate与调用webservice的客户端已及webservice服务器端示意图如下(图片来源 于Spring in Action):.

Spring/Hibernate_应用性能优化的7种方法

- - 企业架构 - ITeye博客
对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能. 此篇文章中将介绍如何确认应用是否受数据库约束,同时介绍七种常用的提高应用性能的速成法. 如何确认应用是否受限于数据库. 确认应用是否受限于数据库的第一步,是在开发环境中进行测试,并使用 VisualVM 进行监控.

七种获取Spring的上下文环境ApplicationContext的方法

- - 孟飞阳的博客
使用实例:UserDao userDao = (UserDao)SpringUtil.getBean("userDao");. 注意:这个地方使用了Spring的注解@Component,如果不是使用annotation的方式,而是使用xml的方式管理Bean,记得写入配置文件:. 方式四: 利用ClassPathResource.