我们的代码中有以下方法,它具有Transactional
注释并且已同步。
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public synchronized void addValueToDB(String value, int parent) {
int nextId = getNextIDUsingSequence();
insertIntoDB(nextId, value);
updateLeft(parent);
updateRight(parent);
}
现在,Transactional
注释在方法完成后在数据库中提交,因此对这个方法的同步对我来说似乎没用? spring是否为此提供了任何解决方案,还是应该从调用此方法的块同步块?
答案 0 :(得分:2)
事务和同步是两回事:
TX(交易)意味着您的代码不会看到其他TX运行的影响(直到某个点......),但不会阻止其他TX运行。例如,您可以尝试从2个TX中更改相同的数据库行。一个(第一个提交)将成功,另一个将失败。
同步会阻止多个线程同时执行您的方法(在您的类的同一个实例上。您的类是单个吗?)。它提供了更强大的隔离
你需要决定你需要哪两个
答案 1 :(得分:0)
代替那个make" getNextIdUSingSequnence"方法同步。 Transactional annotaion将处理addValueToDb方法。