Tengo un servicio de Grails que está marcado como transaccional y hace muchas cosas.Grails Problemas con la transacción
Estoy añadiendo código a este método y no obtener los resultados que espero cuando me paso a través de él:
- tengo código que llama
.save()
que no puede ser visto en el motor MySQL hasta que todo el método termina. Esto es lo que esperaría dado que el método de servicio es transaccional. - Tengo otro código que llama a
.save()
que PUEDE verse en MySQL antes de que finalice el método de servicio. No entiendo esto y no entiendo la disparidad entre esto y 1. - Todavía tengo más código que usa
groovy.sql.Sql
para insertar en la base de datos. Supongo que esto está fuera del procesamiento de transacciones de Grails, por lo que el hecho de que esto se comprometa antes de que finalice el método tiene sentido. ¿Puedo hacer que Grails administre esto dentro de la transacción?
Por favor me desabiliten de cualquier error en mis suposiciones. Aquí hay un código relevante:
Servicio Método principal
public void updateDb(Date date) {
// Create the results
if (createResults() > 0) {
createA()
createB()
}
}
createa
A a = new a()
a.user = user
a.week = week
a.save()
createB
userWeek = new UserWeek(user: user)
userWeek.number = 1
userWeek.save(flush: true)
createResults
String insert = "insert into ..."
Sql sql = new Sql(dataSource)
sql.execute(insert)
que añaden flush:true
para alinearlos, pero ahora entiendo que sólo hibernación al ras, pero en realidad no confirma la transacción, ya que es transaccional. ¿Qué estoy haciendo mal?
No está claro qué está sucediendo en el código que publica, y también me parece que está incumpliendo las convenciones. Desde dentro de un contexto transaccional (la llamada al método Grails), ¿está tratando deliberadamente de salir de la transacción? Además, ¿por qué estás forzando un color? –
@HansWesterbeek No estaba tratando de salir de ninguna transacción, solo estoy mirando el código que heredé e intento darle sentido. Forcé un color como prueba (porque no lo entendí en ese momento) pero planeo eliminarlo.Nada (aparte del método actual 'createResults' que funciona fuera de la transacción) debe confirmar hasta que la transacción completa se confirme, ¿verdad? – skaz