@Transactional 事务手动回滚及提交后操作
2020-04-22 本文已影响0人
任未然
一. 概述
在java开发中我们经常用到@Transactional进行事务处理, 但往往有时候会发现事务不生效, 这是它的一个代理机制造成的, 今天我们来说说几个事务失效的场景及手动设置事务方法
二. 事务失效场景
-
一个有@Transactional的方法被没有@Transactional方法调用时,会导致Transactional作用失效。
-
对非public方法进行事务注解。@Transactional 将会失效。
-
Transactional 事务配置属性中的propagation 属性配置的问题。
-
业务代码被try{}catch(){}了, 这种是最容易犯错的
三. 手动设置事务回滚
3.1 方式一
// 事务管理器
@Autowired
private DataSourceTransactionManager transactionManager;
@Transactional
public void save(User user) {
// 创建一个事务
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// 显式设置事务名称是只能通过编程完成的操作
def.setName("SomeTxName");
// 设置事务策略
// 支持当前交易;如果不存在,请创建一个新的。类似于同名的EJB事务属性。这通常是事务定义的默认设置, 并且通常定义事务同步作用域。
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// 开始事务
TransactionStatus status = transactionManager.getTransaction(def);
try {
// 在这里执行您的业务逻辑
// db操作
// 提交事务
transactionManager.commit(status);
} catch (Exception ex) {
// 事务回滚
transactionManager.rollback(status);
throw ex;
}
}
3.2 方式二
@Transactional //事务的注解
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
@Override
public void updateUser(User user) throws Exception {
try {
userMapper.updateUser(user);
} catch (Exception e) {
//强制手动事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
}
了解更多事务的机制请前往->Spring-事务机制
四. 事务提交后操作
@Transactional //事务的注解
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
@Override
public void updateUser(User user) throws Exception {
userMapper.updateUser(user);
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
// 事务提交后操作
}
});
}
}