【发布时间】:2014-10-06 11:41:04
【问题描述】:
我在我的项目中使用 spring jpa 事务。一个案例包括在同步方法中插入数据,当另一个线程访问它时,数据不会更新。我的代码如下:
public UpdatedDTO parentMethod(){
private UpdatedDTO updatedDTO = getSomeMethod();
childmethod1(inputVal);
return updatedDTO;
}
@Transactional
public synchronized childmethod1(inputVal){
//SomeCodes
//Place where update takes place
TableEntityObject obj = objectRepository.findByInputVal(inputVal);
if(obj == null){
childMethod2(inputVal);
}
}
@Transactional
public void childMethod2(inputVal){
//Code for inserting
TableEntityObject obj = new TableEntityObject();
obj.setName("SomeValue");
obj.setValueSet(inputVal);
objectRepository.save(obj);
}
现在如果两个线程同时访问并且如果第一个线程完成 childmethod2 和 childmethod1 并且之后没有完成 parentMethod() 如果第二个线程来到 childMethod1() 并检查数据是否存在,则数据为 null 并且不由第一个线程更新。我尝试了很多方法,例如
@Transactional(propagation = Propagation.REQUIRES_NEW)
public synchronized childmethod1(inputVal){
//SomeCodes
//Place where update takes place
TableEntityObject obj = objectRepository.findByInputVal(inputVal);
if(obj == null){
childMethod2(inputVal);
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void childMethod2(inputVal){
//Code for inserting
TableEntityObject obj = new TableEntityObject();
obj.setName("SomeValue");
obj.setValueSet(inputVal);
objectRepository.save(obj);
}
还尝试在 childMethod1() 中取消@transactional,但没有任何效果。我知道我在这里做错了,但无法弄清楚我到底在哪里做错了。谁能帮我解决这个问题
【问题讨论】:
-
为什么你的方法既是同步的又是事务的?
标签: spring hibernate jpa web spring-data-jpa