Java Spring Hibernate JPA@Transaction(Propagation.REQUIRES_NEW)可以';找不到目标

Java Spring Hibernate JPA@Transaction(Propagation.REQUIRES_NEW)可以';找不到目标,java,spring,hibernate,jpa,transactions,Java,Spring,Hibernate,Jpa,Transactions,我盯着显示器看了5个小时后才问这个问题 我有以下格式的代码 @Transaction(readmode=true) class SomeServiceClass { @Autowired SubServiceClassA subServiceClassA; @Autowired SubServiceClassB subServiceClassB; public void doSomething() { Long id = subServ

我盯着显示器看了5个小时后才问这个问题

我有以下格式的代码

@Transaction(readmode=true)
class SomeServiceClass {
    @Autowired
    SubServiceClassA subServiceClassA;

    @Autowired
    SubServiceClassB subServiceClassB;

    public void doSomething() {
        Long id = subServiceClassA.performSave();

        subServiceClassB.performAction(id);
    }
}
我保存一个对象并返回id

@Service
class SubServiceClassA {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public Long performSave() {
        SomeObj someObj = someRepository.save(SomeObj someObj);
        return someObj.getId();
    }
}
稍后在一个单独的
REQUIRES\u NEW
事务中,我尝试对新保存的对象执行一些操作

@Service
class SubServiceClassB {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void performAction(Long id) {
        SomeObj someObj = someRepository.find(id);
        // someObj is null here!!! :(
    }
}
我的理解是,这段代码应该可以工作,因为保存的对象是在一个单独bean中的
REQUIRES\u NEW
事务中

我的问题是,这段代码在我的本地环境中非常有效。当我上传到生产设置时,我得到一个NPE,因为
someObj
null
。(我们使用的是gradle,因此依赖项应该是相同的)

如果我能得到任何关于这可能不起作用的建议,我将不胜感激。

找到了解决方案

我想我是在没有额外信息的情况下发布的

我的ServiceB类中的代码是

@Service
class SubServiceClassB {
    @Transactional(propagation=Propagation.REQUIRES_NEW, readonly=true)
    public void performAction(Long id) {
        SomeObj someObj = someRepository.find(id);
        // someObj is null here!!! :(
    }
}
问题是我正在将ServiceA中的一个对象写入主数据库,但从从数据库读取。显然,设置
readonly=true
会强制服务器从slaveDB读取,但是新保存的对象尚未复制到slaveDB


删除
readonly=true
后,一切正常

代码退出SubServiceClassA.performSave()方法后是否触发插入查询?插入代码为
someRepository.save(SomeObj-SomeObj)。它位于
子服务类a中。performSave()
method尝试从另一个方法调用子服务类B.performAction(id)。
@Transaction(readmode=true)
SomeServiceClass
的目的是什么除了需要
@Transactional
doSomething
之外,还有其他方法。
subServiceClassB.performAction(id)
应该采用不同的方法,这有什么原因吗?无论如何,它应该在一个新事务中……我的意思是:退出performSave()时是否触发了实际的SQL查询?试图了解事务是否实际提交给db