Java Spring Hibernate JPA@Transaction(Propagation.REQUIRES_NEW)可以';找不到目标
我盯着显示器看了5个小时后才问这个问题 我有以下格式的代码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
@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