7

ログに「データベースの状態をセッションと同期できませんでした」という例外が表示されるようになり、それを再現するのに苦労しています。うまく動作することもあります... 2 つの例外が発生しています (これらは異なるタイミングで発生しています)。

エラー JDBCExceptionReporter - ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再起動してみてください ERROR PatchedDefaultFlushEventListener - データベースの状態をセッション org.hibernate.exception.LockAcquisitionException と同期できませんでした: 更新できませんでした: [com.myapp.School#1911]

エラー PatchedDefaultFlushEventListener - データベースの状態をセッション org.hibernate.StaleObjectStateException と同期できませんでした: 別のトランザクションによって行が更新または削除されました (または、保存されていない値のマッピングが正しくありませんでした): [com.myapp.School#1905]

それらがスローされるメソッドは次のとおりです。

def populateFriends(ArrayList<FriendView> friends, User user) {

    friends.eachWithIndex { friendView, index ->

        def friend = Friend.findByFriendId(friendView.id) ?: new Friend()
        def schoolName = friendView.schoolName
        def school = null
        if (schoolName) {
            school = School.findByName(schoolName) ?: new School(name: schoolName).save(flush:true)
        }
        if (school) {
            // add to user's school list
            user = User.get(user.id)
            user.addToSchools(school)
            user = user.merge(flush: true)
            user.save(flush: true)

            friend.school = school
        }
        friend.save(flush: true)
    }
}

私は一日中これにいたので、助けていただければ幸いです。

4

2 に答える 2

4

ここでの答えは、lock:true を使用することです。

School.findByName(name, [lock: true])
于 2012-11-09T19:18:09.820 に答える
1

試してみてください:

User.withTransaction {
    ...
    user.save(flush:true)
    sessionFactory.currentSession.flush()
    sessionFactory.currentSession.clear()
}
于 2012-07-14T17:00:54.140 に答える