2012-06-27 6 views
7

ログの "データベース状態とセッションを同期できませんでした"という例外が発生し、再現が困難です。時にはそれが正常に動作します...私は(彼らは、異なる時間に起こっている)の2つの例外を見ています:予期しない "grailsのデータベース状態とセッションを同期できませんでした"

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

そして

ERROR PatchedDefaultFlushEventListener - セッションとデータベース状態を同期できませんでした。org.hibernate.StaleObjectStateException: 行が別のトランザクション(または保存されていない値 m)によって更新または削除されましたapping)間違っていました:[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) 
    } 
} 

私はこれを一日中してきたと私は本当に感謝します助けてください。真:

User.withTransaction { 
    ... 
    user.save(flush:true) 
    sessionFactory.currentSession.flush() 
    sessionFactory.currentSession.clear() 
} 
+0

あなたはここにあなたの全体の学校のドメインを投稿することができます - 2)なぜあなたは、ユーザをしている= user.merge(フラッシュ:真) –

+0

は、あなたが(user.refreshを試してみましたが)?私はいくつかの厄介な行動を経験するとき、私は通常、この投稿を参照してください:http://stackoverflow.com/questions/536601/what-are-your-favorite-grails-debugging-tricksまたはより正確には、 。 – marko

+1

しかし、彼は本当になぜこれが起こり、問題の原因が何であるかを把握しようとするべきです。なぜこれが最初に起こるのか分からない限り、私は回避策を講じません。 –

答えて

4

ここで答えはロックを使用することです:

1

をしてみてください。

School.findByName(name, [lock: true]) 
関連する問題