我有一个 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/