2012-06-03 27 views
5

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:

  1. 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.
  2. 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.
  3. 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?

+0

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? –

+0

@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

Respuesta

7

Puede obtener groovy.sql.Sql se ejecuta en la transacción de que su método de servicio está utilizando mediante el uso de la Sql constructor that takes a connection argument lugar:

  Sql sql = new Sql(sessionFactory.currentSession.connection()) 

Esto debería resolver el problema de los datos conseguir comprometido en diferentes momentos en el mismo método de servicio.

+0

Gracias - ¡esto definitivamente resolverá parte de mi problema! – skaz

0

Estaba en una situación similar. Lo que me solucionó fue llamar al método refresh(). También probé Flush: cierto y muchas otras cosas, pero nada funcionó.

Puede leer sobre la actualización here.