如果我错了,请纠正我。
我遇到的问题是我的交易没有保存到数据库中,而且正在进行某种竞争,这会导致数据搞砸。该应用程序由多个实例并行命中。我使用了@Transactional,我知道这是与数据库进行的事务,并且在方法返回时提交事务。
问题是,通过多个实例打击它仍然会保持每个命中事件的这一个事务,或者它不处理这种情况,数据会因为竞争而搞砸了吗?
是否可以针对给定条件建议解决方案?
答案 0 :(得分:3)
@Transactional
与同步无关。它只是确保您的流程成功或失败。每次打击都有自己的流程和自己的成功或失败。
我猜你正在经历的是由于共享数据的使用。
例如。如果您的班级Foo
如下所示:
public class Foo {
private static boolean flag = true;
@Transactional
public void doSomething() {
flag = false;
}
}
在这种情况下,您拥有多个Foo
个实例并不重要,因为它们都使用相同的flag
。
另一种情况是,如果您有一个Foo
实例(如果您使用类似Spring
之类的内容非常常见)并且您为此实例更改了数据。您可以查看相同的Foo
示例,只需从static
移除flag
:
public class Foo {
private boolean flag = true;
@Transactional
public void doSomething() {
flag = false;
}
}
在任何一种情况下,您都需要以某种方式同步数据更改。它与@Transactional
无关。
答案 1 :(得分:2)
该事务是数据库事务,并且行为依赖于数据库引擎,但它通常以这种方式工作:
@Transactional
与同步无关。SELECT * FROM MYTABLE FOR UPDATE;
。UPDATE MYTABLE SET A = A + 1;
并阻止。