2015-04-03 100 views
2

我们在我们的代码中有以下方法,它有Transactional注释并被同步。Spring中的同步交易方法

@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

你解决问题了吗?你能分享你的解决方案吗?谢谢。 – 2015-08-31 03:23:44

+0

@PedroPedruzzi我们所做的是,我们将服务层中的块与该方法被调用的位置同步。 – 2015-09-01 04:18:26

回答

0

而不是使“getNextIdUSingSequnence”方法同步。事务注释将处理addValueToDb方法。

2

交易和同步是两个不同的东西:

  1. 一个TX(交易)意味着你的代码不会看到运行alongsde它的其他的TX的效果(在一定程度上...)但不会阻止其他TX运行。例如你可以尝试修改2 TX中的同一个数据库行。一个(第一个提交)会成功,另一个会失败。

  2. 同步会阻止多线程同时执行您的方法(在您的类的同一实例上,您的类是单例?)。它提供了更强大的隔离

你需要决定你需要将2

+0

这些是两种不同的东西,但我们都需要。所以问题是应该在哪里同步? (或者泉是否提供任何解决方案?) – 2015-04-03 07:13:26