java - 在多用户环境中使 grails 服务方法原子化

标签 java grails parallel-processing atomic

我有一个 grails 服务方法 load,我一次只希望一个用户能够运行它。我试过使用 Grails 悲观锁,但它只是有时有效。在我的 Controller 中,我有:

try {
    def country = Country.lock(id)
    myService.load(country)
} catch (CannotAcquireLockException ex) {
    flash.message = "Another user is modifying ${Country.get(id)}"
}

使 myService 的加载方法成为原子的最佳方法是什么?

如果我希望两个方法是原子的(当一个正在执行时,两个都不能执行)怎么办?

我的服务方法:

def load(id) {
    def country = Country.get(id)
    country.states.each {
        ...
        it.save(flush: true)
    }
}

将 synchronized 关键字添加到此方法会导致保存时出现 StaleObjectStateException。

最佳答案

默认情况下,Grails 服务是单例的,它可以解决您的部分问题。您还应该使您的服务方法同步以实现您想要的:

def synchronized load(country) { ... }

关于java - 在多用户环境中使 grails 服务方法原子化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14047404/

相关文章:

grails - Grails URL映射排除dbconsole

c# - Azure - C# 并发 - 最佳实践

java - 使用 selenium webdriver 按类名和标记名查找元素

java - 用 Java 保存所有消息的好方法

java - 为什么这段带有泛型的java代码不能编译

使用 Redis 的 Grails spring-security-ldap 缓存缓存

grails - grails依赖报告后如何删除有罪的jar文件

multithreading - 为什么我的程序用一个核心而不是两个核心更快?

Python(或一般的 linux)文件操作流控制或文件锁定

java.lang.unsatisfiedlinkerror 无法加载 amd 64 位 .dll ia 32 位