Spring事务回滚的两种方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事务回滚的两种方法相关的知识,希望对你有一定的参考价值。

##方法一

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事务回滚的两种方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring事务超时回滚的相关说明

关于Spring事务回滚的问题

Spring管理事务默认回滚的异常

Spring事务管理回滚问题

JPA中事务回滚的问题

Java事务不回滚的原因总结