query - grails tutorial
Imposible predecir "No se pudo sincronizar el estado de la base de datos con la sesión" en griales (2)
La respuesta aquí es usar lock: true.
School.findByName(name, [lock: true])
Estoy empezando a ver las 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. Algunas veces funciona bien ... Veo dos excepciones (están sucediendo en diferentes momentos):
ERROR JDBCExceptionReporter - Se encontró un punto muerto al tratar de obtener el bloqueo; intente reiniciar la transacción ERROR PatchedDefaultFlushEventListener - No se pudo sincronizar el estado de la 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 actualizó o eliminó mediante otra transacción (o la asignación de valores no guardados fue incorrecta): [com.myapp.School # 1905]
Este es el método donde se arrojan:
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)
}
}
He estado en esto todo el día y realmente agradecería cualquier ayuda.
Prueba con:
User.withTransaction {
...
user.save(flush:true)
sessionFactory.currentSession.flush()
sessionFactory.currentSession.clear()
}