2012-06-27 4 views
7

Ich fange an zu sehen, "Datenbankstatus mit Sitzung" Ausnahmen in meinen Protokollen nicht synchronisieren konnte und ich habe eine harte Zeit, es zu reproduzieren. Manchmal funktioniert es gut ... Ich sehe zwei Ausnahmen (sie sind zu verschiedenen Zeiten passiert):Unvorhersagbar "Konnte Datenbankstatus mit Sitzung nicht synchronisieren" Ausnahmen in Grails

Fehler JDBCExceptionReporter - Deadlock beim Versuch, Sperre zu erhalten; versuchen Transaktion ERROR PatchedDefaultFlushEventListener Neustart - konnte nicht Datenbank-Status mit Sitzungs org.hibernate.exception.LockAcquisitionException synchronisieren: konnte nicht aktualisiert werden: [com.myapp.School # 1911]

Und

FEHLER PatchedDefaultFlushEventListener - Konnte nicht synchronisieren Datenbankstatus mit Sitzung org.hibernate.StaleObjectStateException: Zeile wurde von einer anderen Transaktion aktualisiert oder gelöscht (oder nicht gespeicherte Wert m apping war falsch): [com.myapp.School # 1905]

Hier ist die Methode, wo sie geworfen werden:

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) 
    } 
} 

Ich habe den ganzen Tag in diesem und ich würde wirklich zu schätzen irgendeine Hilfe.

+0

Können Sie Ihre ganze Schule Domain hier posten - 2), warum Sie tun user = user.merge (flush: true) –

+0

Haben Sie versucht, user.refresh()? Wenn ich etwas seltsames Verhalten erfahre, beziehe ich mich normalerweise auf diesen Beitrag: http://stackoverflow.com/questions/536601/what-are-your-favorite-grails-debugging-tricks oder um genauer zu sein, die Antwort mit einem Versuch zu speichern . – marko

+1

Aber er sollte wirklich versuchen herauszufinden, warum das passiert und was die Ursache des Problems ist, ich würde keine Abhilfe schaffen, bis ich weiß, warum das überhaupt passiert. –

Antwort

4

Die Antwort ist Sperre zu verwenden: true.

School.findByName(name, [lock: true]) 
1

Versuchen mit:

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