前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring事务回滚的两种方法

Spring事务回滚的两种方法

作者头像
每周聚焦
发布2023-02-22 17:41:39
9930
发布2023-02-22 17:41:39
举报
文章被收录于专栏:每周聚焦每周聚焦

当然,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); 来提交这个事务
代码语言:javascript
复制
@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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法一
  • 方法二
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档