这个错误通常是因为在使用Spring事务管理时,使用了Propagation.MANDATORY传播级别,但是当前没有已经存在的事务。
Propagation.MANDATORY传播级别表示当前方法必须在一个已经存在的事务中运行,如果当前没有已经存在的事务,则会抛出NoTransactionException异常。
解决这个问题的方法有两种:
-
将Propagation.MANDATORY传播级别改为Propagation.REQUIRED或者Propagation.REQUIRES_NEW,这样就不会要求当前方法必须在一个已经存在的事务中运行了。
-
确保当前方法在一个已经存在的事务中运行。可以通过在调用当前方法的方法上添加@Transactional注解来确保事务的存在,或者在当前方法中手动开启一个新的事务,例如:
@Service
public class MyService {
@Autowired
private PlatformTransactionManager transactionManager;
public void myMethod() {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// 在这里执行需要在事务中运行的代码
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}
}
}
报错原代码:
优化后的代码: