2012-06-27 12 views
7

Zaczynam widzieć "Nie mogę zsynchronizować stanów bazy danych z sesją" w moich dziennikach i ciężko mi to odtworzyć. Czasami działa dobrze ... Widzę dwa wyjątki (zdarzają się w różnym czasie):Nieprzewidywalne "Nie można zsynchronizować stanów bazy danych z sesją" wyjątki w grails

BŁĄD JDBCExceptionReporter - Zakleszczenie znalezione podczas próby uzyskania blokady; spróbuj ponownie ERROR transakcja PatchedDefaultFlushEventListener - Nie można synchronizować stan bazy danych z sesji org.hibernate.exception.LockAcquisitionException: nie można aktualizować: [com.myapp.School # 1911]

I

BŁĄD PatchedDefaultFlushEventListener - Nie można zsynchronizować stanu bazy danych z z sesją org.hibernate.StaleObjectStateException: Wiersz został zaktualizowany lub usunięty przez inną transakcję (lub niezapisana wartość m apping była błędna): [com.myapp.School # 1905]

Oto metoda, gdzie są one wyrzucane:

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

Byłem w tym cały dzień, a ja naprawdę docenić jakaś pomoc.

+0

można pisać całe domenę szkole tutaj - 2) dlaczego robisz user = user.merge (kolor: true) –

+0

Czy próbowałeś user.refresh()? Kiedy doświadczam jakiegoś dziwnego zachowania, zazwyczaj odnoszę się do tego postu: http://stackoverflow.com/questions/536601/what-are-your-favorite-grails-debugging-tricks lub, aby być bardziej precyzyjnym, odpowiedź z próbą zapisu . – marko

+1

Ale powinien naprawdę spróbować dowiedzieć się, dlaczego tak się dzieje i jakie jest źródło problemu, nie zrobiłbym obejścia, dopóki nie wiem, dlaczego tak się dzieje na pierwszym miejscu. –

Odpowiedz

4

Odpowiedź tutaj jest użycie blokady: true.

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

Spróbuj z:

User.withTransaction { 
    ... 
    user.save(flush:true) 
    sessionFactory.currentSession.flush() 
    sessionFactory.currentSession.clear() 
} 
Powiązane problemy