我在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_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_NEW
事务中。
我的问题是这段代码在我的本地设置中运行良好。当我将其上传到生产设置时,我得到了NPE,因为someObj
是null
。 (我们正在使用gradle,所以依赖应该是相同的)
如果我能得到任何关于为什么这可能不起作用的指示,我将非常感激。
答案 0 :(得分:0)
找到解决方案
我想我的帖子没有额外的信息
我的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中将对象写入主DB,但是从从DB读取。显然,设置readonly=true
迫使服务器从slaveDB读取,但是新持久化的对象还没有被复制到从属数据库。
删除readonly=true
后,一切正常。