2012-06-27 13 views
7

Estoy empezando a ver excepciones "No se pudo sincronizar el estado de la base de datos con la sesión" en mis registros y estoy teniendo dificultades para reproducirlo. A veces funciona bien ... Veo dos excepciones (están sucediendo en diferentes momentos):impredecibles excepciones "No se pudo sincronizar el estado de la base de datos con la sesión" en grails

ERROR JDBCExceptionReporter - Se ha encontrado un punto muerto al intentar obtener el bloqueo; intente reiniciar PatchedDefaultFlushEventListener error de transacción - No se pudo sincronizar el estado de base de datos con la sesión org.hibernate.exception.LockAcquisitionException: No se pudo actualizar: [com.myapp.School # 1911]

Y

ERROR PatchedDefaultFlushEventListener: no se pudo sincronizar el estado de la base de datos con la sesión org.hibernate.StaleObjectStateException: La fila se ha actualizado o eliminado por otra transacción (o no guardado m apping era incorrecta): [com.myapp.School # 1905]

Aquí es el método en el que se tiran:

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

que he estado en esto durante todo el día y yo realmente lo apreciaría alguna ayuda.

+0

Se puede publicar su dominio de toda la escuela aquí - 2) ¿por qué haces user = user.merge (ras: true) –

+0

¿Ha intentado user.refresh()? Cuando experimento algún comportamiento extraño, por lo general me remito a esta publicación: http://stackoverflow.com/questions/536601/what-are-your-favorite-grails-debugging-tricks o, para ser más precisos, la respuesta con una prueba de guardar . – marko

+1

Pero él realmente debería tratar de entender por qué sucede esto y cuál es la fuente del problema, no haría una solución hasta que sepa por qué sucede esto en primer lugar. –

Respuesta

4

La respuesta aquí es utilizar el bloqueo: cierto.

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

intento con:

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