java - 当一个@Transactional 注解的方法被多个实例并行命中时会发生什么?

标签 java spring transactions

如有错误,请指正

我遇到了一个问题,我的交易没有被保存到数据库中,并且正在发生某种竞争,这会搞砸数据。该应用程序被多个实例并行命中。我使用了@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/

相关文章:

java - Libgdx 显示得分并每秒加 1 得分

java - 在 Java 中拆分字符串和模式匹配

java - 如何为第三方枚举自定义反序列化器?

jquery - 处理 Thymeleaf Spring MVC AJAX 表单及其错误消息的推荐方法

php - 如何在同一事务中保存和删除

python - ZODB:transaction.savepoint 向哪里写入数据?

java - 如何使用findViewById获取ListView

java - 实例化/从枚举返回时类型安全的接口(interface) (Java)

java - spring boot “Whitelabel Error Page” 无可用消息

java - EJB3 容器管理的持久性 - 实体何时变为非托管状态