首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当外部事务标记为回滚时,回滚所有嵌套事务

当外部事务标记为回滚时,回滚所有嵌套事务
EN

Stack Overflow用户
提问于 2012-06-25 17:00:33
回答 3查看 8.4K关注 0票数 4

我有两个用@Transactional注释的方法。第二个方法是在第一个方法中嵌套的地方调用的。

现在,我希望发生以下行为:

  • 每次输入第二个嵌套方法时,都应该创建一个新的嵌套事务。当该事务被标记为回滚时,只应回滚该事务。
  • 但是,当外部方法的事务被标记为回滚时,内部的每个嵌套事务--无论是否标记为回滚--都应该回滚。

如何设置Propagation值才能实现这样的功能?

我用的是HibernateTransactionManager

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-25 17:06:13

您需要使用巢式。请注意,为了实现此行为,此传播模式使用JDBC SavePoints,因此,嵌套行为只有在事务只是JDBC连接的包装器时才能工作。它不适用于JTA事务。有关更多细节,请参见春季文献

票数 4
EN

Stack Overflow用户

发布于 2014-02-14 17:20:22

应该澄清Java事务中的默认行为。除非父事务提交,否则所有嵌套事务都不会提交。在这里阅读持久性/事务

票数 1
EN

Stack Overflow用户

发布于 2016-11-15 18:23:58

我建议在单独的线程中实现这样的功能,即您希望在嵌套事务中启动的方法--只需在单独的线程中启动它们。它可能类似于以下伪代码:

代码语言:javascript
复制
//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中的单个外部事务中做嵌套事务工作,只需等待线程返回的结果,并在需要时抛出异常

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11193806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档