详解Spring事务回滚的两种方法
作者:阿杆
Spring事务回滚的前提是你当前使用的数据库必须支持事务,比如MySQL的Innodb是支持的,但Mysaim则是不支持事务的,本文就给大家介绍两种Spring事务回滚的方法,需要的朋友可以参考下
方法一
使用
@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事务回滚的两种方法的文章就介绍到这了,更多相关Spring事务回滚内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!