3

一度に 1 人のユーザーのみが実行できるようにしたい grails サービス メソッド load があります。Grails 悲観的ロックを使用してみましたが、時々しか機能しません。私のコントローラーには、次のものがあります。

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

myService の load メソッドをアトミ​​ックにする最良の方法は何ですか?

2 つのメソッドをアトミ​​ックにしたい場合はどうすればよいですか (一方が実行中の場合、どちらも実行できません)。

私のサービスの方法:

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

このメソッドに synchronized キーワードを追加すると、保存時に StaleObjectStateException が発生します。

4

3 に答える 3

2

Grails サービスはデフォルトでシングルトンであり、問​​題の一部を処理します。また、必要なものを実現するには、サービス メソッドを同期する必要があります。

def synchronized load(country) { ... }
于 2012-12-27T00:18:19.083 に答える
1

これは、 ReentrantLockを使用する通常の Java 同期の問題として解決できます。ロックが同じことを行うのをユーザーに待たせる代わりに、isLocked を使用してエラーを返すことができます。

于 2012-12-27T01:31:00.657 に答える