当前位置: 首页 > 知识库问答 >
问题:

@Transactional仅在@Transactional与子事务一起使用时标记为回滚

彭洲
2023-03-14

我有一个类,它有一个标记为@Transactional的方法。从该方法中,会调用多个标记为@Transactional的方法。所以,从层次上讲,这就像有一个父事务和多个子事务。当我调用从数据库获取数据的方法,然后最终调用一个应该将数据存储在数据库中的方法时,就会出现问题,然后事务提交失败,并用“…标记为仅回滚的事务…”标记事务。

代码示例:

甲级

class A{
    @Transactional
    public void parentMethod(){
        B b = B.getB();
        C c = c.getC();
        D d = new D();
        d.setB(b);
        d.setC(c);
        service.save(d);
    }
}

B类

class B{
    @Transactional
    public B getB(){
        repository.getById(xxx);
    }
}

C类

class C{
    @Transactional
    public C getC(){
        repository.getById(xxx);
    }
}

服务

@Transactional
public D save(D d){
    repository.save(d);
}

正如您在上面的代码中看到的,当我调用方法service.save(d);时,我得到了“...标记为仅回滚的事务...”异常。但是,如果我像这样注释所有“get”子事务

 @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)

我得到了预期的结果,例如,事务被正确提交,没有异常发生。

注意:在我的真实示例中,我有多个“save();”方法和多个“get();”最后一个“save();”之前的方法方法

编辑:看看这个问题:为什么从数据库中获取数据和插入数据在同一个“父”事务中不起作用?

这与这个问题有关。但这个问题仍然存在。


共有1个答案

吴鸿禧
2023-03-14

传播REQUIRES_NEW:不要使用它,因为它会创建一个新事务,如果存在,则会暂停当前事务。

使用@Transaction的默认配置:传播。必需支持当前事务,如果不存在,则创建一个新事务。

 类似资料:
  • 使用spring4@transactional和jdbctemplate时事务不起作用!!请帮帮我 application.xml 代理创建失败?

  • 我在下面的代码中使用了Spring的@Transactional注释和JDBC模板,它不回滚事务。我使用了随机文件名和表名。我正在尝试删除外键id的行,然后在名为“data”的数据库表中插入相同id的记录。但是当我测试的时候,我发现如果插入中有错误,删除就不会被回滚。我对Spring还是个新手,如果有任何帮助,我将不胜感激。 testRepository.java database.xml

  • 我有一个eventhandler方法,它被注释为@Transactional,这个方法在同一个类中调用一个事件的实现。 此事件执行一些检查,根据结果,它将执行某些操作,或者更改状态并抛出RuntimeException。 status change方法在另一个类中,并且该方法用@transactional(propagation=propagation.requires_new)注释。 我预计,由

  • 我正在使用Guice注入EntityManager。当我提交注入实体管理器的操作时,BD端没有发生任何事情:没有事务通过!!!你能帮我弄清楚发生了什么吗? 这是我的代码: 网状物xml Inject torListener类: 持久性模块类: GuiceModule类: RestModule类: 公共类RestModule扩展了JerseyServletModule{ 最后是网络服务(jeresy

  • @Transactional标记是最近添加的。所以不确定它是否像预期的那样工作。 代码: 服务类别:

  • 我对事务REST控制器中的一些异常处理感到困惑。 我有一个管理服务,看起来像: 我有一个REST控制器,看起来像: 它使用@Transactional(readOnly = true)注释。 如果存在此注释并且没有找到搜索的项目,则它会给出以下异常: 如果删除注释,则一切正常,响应包含搜索的项。 我假设当没有找到搜索的条目时会抛出一个异常,触发事务回滚消息。 以下是异常处理程序: 有没有办法在日志