如有错误,请指正
我遇到了一个问题,我的交易没有被保存到数据库中,并且正在发生某种竞争,这会搞砸数据。该应用程序被多个实例并行命中。我使用了@Transactional,我知道它是与数据库进行事务处理,并且在方法返回时提交事务处理。
问题是,通过多个实例命中它是否仍然保持每次命中一个事务,或者它不处理这种情况并且数据会因为竞争而搞砸?
能否针对给定条件提出解决方案?
最佳答案
@Transactional
与同步无关。它只是确保您的流程成功或失败。每次点击都有自己的流程和成功或失败。
我猜您遇到的问题是由于使用了共享数据。
例如。如果你有一个看起来像这样的 Foo
类:
public class Foo {
private static boolean flag = true;
@Transactional
public void doSomething() {
flag = false;
}
}
在这种情况下,您有很多 Foo
实例并不重要,因为它们都使用相同的 flag
。
另一种情况是,如果您有一个 Foo
实例(如果您使用 Spring
之类的东西,这很常见)并且您有针对该实例更改的数据。您可以查看相同的 Foo
示例,只需从 flag
中删除 static
:
public class Foo {
private boolean flag = true;
@Transactional
public void doSomething() {
flag = false;
}
}
在任何一种情况下,您都需要以某种方式同步数据更改。它与 @Transactional
无关。
关于java - 当一个@Transactional 注解的方法被多个实例并行命中时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804301/