Spring事务回滚的两种方法

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

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
#Java##程序员#
全部评论

相关推荐

07-18 14:03
门头沟学院 Java
点赞 评论 收藏
分享
zzzzhz:兄弟你先猛猛投简历至少三百家,能约到面试就去面。最近可以速成智能小车,智慧家居烂大街的项目,不需要自己写,只需要把里面的代码讲解看明白就行。把其中涉及到的八股文都拿出来单独背一下,我去年找工作就一个智能小车智慧家居找了10k差不多。
点赞 评论 收藏
分享
最近拿到了正浩的提前批offer感觉自己的实力得到了肯定,也给了我更多底气
搞机墨镜猫:正浩提前批官网好像就只有电力电子软硬件,哥们投的是这两个岗位吗
26届校招投递进展
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务