2017-01-12 6 views
0

データベースオブジェクトを検索してロックしてから、自動的にロックを解除するGroovy/Grails 3関数を記述しようとしています。Grailsトランザクションでロックを解放するのを待ちます。

関数が複数回呼び出された場合は、ロックが解放されるまで待機してから更新プログラムを実行する必要があります。どうすればこれを達成できますか? Hibernateセッションは、トランザクションを完了し、データベース・レベルでのロックを解除する必要がありフラッシング

def updateUser(String name) { 
    User u = User.get(1) 
    // if locked, wait until released somehow? 
    u.lock() 
    u.name = name 
    u.save() 
} 

updateUser('bob') 
updateUser('fred') // sees lock from previous call, waits until released, then updates 
+1

あなたが必要です.NewTransaction最近の回答が見つかりませんでした。ここに古いものがありますhttp://stackoverflow.com/questions/21805893/handling-grails-transactions-programatically。ロックレコードを気にする必要はないと思う。 。WithNewTransactionの周りにそれをラップします。これはまた、あなたが直後にそれを問い合わせる場合、同じことをする必要があるかもしれないことを意味します... – Vahid

答えて

0

一般に、pessimistick lockingtransactional contextでのみ動作します。 @Transactionalで注釈が付けられたサービスにupdateUserメソッドを配置してください。

get()およびlock()を呼び出すと、2つのSQL文が実行されます(オブジェクトを取得するためのものと、ロックするためのもの)。 User.lock()を使用すると、代わりにudpateクエリ用のselect ...が発行されます。

@Transactional 
class UserService { 
    def updateUser(String name) { 
     User u = User.lock(1) // blocks until lock is free 
     u.name = name 
     u.save() 
    } 
} 
関連する問題