我有两个用@Transactional注释的方法。第二个方法是在第一个方法中嵌套的地方调用的。
现在,我希望发生以下行为:
如何设置Propagation值才能实现这样的功能?
我用的是HibernateTransactionManager。
发布于 2012-06-25 17:06:13
您需要使用巢式。请注意,为了实现此行为,此传播模式使用JDBC SavePoints,因此,嵌套行为只有在事务只是JDBC连接的包装器时才能工作。它不适用于JTA事务。有关更多细节,请参见春季文献。
发布于 2014-02-14 17:20:22
应该澄清Java事务中的默认行为。除非父事务提交,否则所有嵌套事务都不会提交。在这里阅读持久性/事务
发布于 2016-11-15 18:23:58
我建议在单独的线程中实现这样的功能,即您希望在嵌套事务中启动的方法--只需在单独的线程中启动它们。它可能类似于以下伪代码:
//SomeService
// Here we start an external transaction
@Transactional
int processAllInTransaction() {
List<Integer> jobIds = jobService.getJobs();
if (!jobIds.isEmpty()) {
new Thread(new Runnable() {
@Override
public void run() {
jobIds.forEach(jobId ->
//Execute eveything in external transaction
threadPool.execute(jobId)
);
}
}).start();
}
return jobIds.size();
}
//Method of Executor Service
void execute(final int jobId) {
tasks.add(taskExecutor.submit(new Runnable() {
void run() {
someProcessor.processJob(jobId);
}
}));
}
//Method of another Service
@Transactional
public void processJob(int jobId) {
//this will work in separate thransaction since was executed in another Theread
someDao.doWorkInExternalTransaction(jobId);
}如果您确实需要控制外部事务--在新Theread中的单个外部事务中做嵌套事务工作,只需等待线程返回的结果,并在需要时抛出异常
https://stackoverflow.com/questions/11193806
复制相似问题