2012-06-27 7 views
7

Sto iniziando a vedere le eccezioni "Impossibile sincronizzare lo stato del database con la sessione" nei miei registri e ho difficoltà a riprodurlo. A volte funziona bene ... Sto vedendo due eccezioni (stanno accadendo in momenti diversi):Imprevedibile "Impossibile sincronizzare lo stato del database con la sessione" eccezioni in grails

ERRORE JDBCExceptionReporter - Trovato quando si cerca di ottenere il blocco; provare a riavviare transazione ERRORE PatchedDefaultFlushEventListener - Impossibile sincronizzare lo stato di sessione di database con org.hibernate.exception.LockAcquisitionException: non poteva aggiornare: [com.myapp.School # 1911]

E

ERRORE PatchedDefaultFlushEventListener - Impossibile sincronizzare lo stato del database con la sessione org.hibernate.StaleObjectStateException: La riga è stata aggiornata o eliminata da un'altra transazione (o valore non salvato m ANALITICI era corretto): [com.myapp.School # 1905]

Qui è il metodo in cui vengono gettati:

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

Sono stato in questo tutto il giorno e mi piacerebbe davvero apprezzare qualsiasi aiuto.

+0

potete inserire il vostro dominio tutta la scuola qui - 2) perché stai facendo user = user.merge (flush: vero) –

+0

Hai provato user.refresh()? Quando provo qualche comportamento strano di solito mi riferisco a questo post: http://stackoverflow.com/questions/536601/what-are-your-favorite-grails-debugging-tricks o per essere più precisi, la risposta con un tentativo di salvataggio . – marko

+1

Ma dovrebbe davvero cercare di capire perché questo accada e qual è la fonte del problema, non farei una soluzione finché non saprò perché succede in primo luogo. –

risposta

4

La risposta qui è quello di utilizzare il blocco: vero.

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

Prova con:

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