2012-06-03 18 views
5

Ho un servizio Grails contrassegnato come transazionale e che fa un sacco di cose.Grails Transaction Issues

Io sono l'aggiunta di codice a questo metodo e non ottenere i risultati che mi aspetto quando faccio un passo attraverso di essa:

  1. Ho codice che chiama .save() che non può essere visto nel backend MySQL fino a quando l'intero metodo termina. Questo è quello che mi aspetterei dato che il metodo di servizio è transazionale.
  2. Ho un altro codice che chiama .save() che può essere visualizzato in MySQL prima che il metodo di servizio termini. Non capisco questo e non capisco la disparità tra questo e 1.
  3. Ho ancora più codice che utilizza il groovy.sql.Sql da inserire nel database. Sto indovinando che questo è al di fuori dell'elaborazione della transazione di Grails, quindi il fatto che questo si impegna prima della fine del metodo ha senso. Posso ottenere Grails per gestire questo all'interno della transazione?

Per favore mi disastimi da eventuali errori nelle mie ipotesi. Ecco alcuni codice rilevante:

Servizio Metodo principale

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) 

ho aggiunto flush:true per renderlo a filo, ma ora capisco che a poco a filo di ibernazione, ma in realtà non commettere la transazione dal momento che è transazionale. Che cosa sto facendo di sbagliato?

+0

Non è chiaro cosa stia succedendo dal codice che pubblichi, e mi sembra anche che tu stia rompendo le convenzioni. Dall'interno di un contesto transazionale (la chiamata al metodo Grails) stai cercando intenzionalmente di uscire dalla transazione? Inoltre, perché stai forzando un colore? –

+0

@HansWesterbeek Non stavo cercando di uscire da nessuna transazione - sto solo guardando il codice che ho ereditato e cercando di dare un senso a questo. Ho forzato un flush come test (perché non l'ho capito al momento) ma ho intenzione di rimuoverlo.Niente (a parte l'attuale metodo 'createResults' che funziona al di fuori della transazione) dovrebbe impegnarsi fino a quando l'intera transazione non si impegna, giusto? – skaz

risposta

7

È possibile ottenere groovy.sql.Sql esecuzione nella transazione che il vostro metodo di servizio sta usando tramite Sql constructor that takes a connection argument invece:

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

Questo dovrebbe risolvere il problema dei dati sempre impegnata in tempi diversi nello stesso metodo di servizio.

+0

Grazie - risolverà sicuramente parte del mio problema! – skaz

0

Mi trovavo in una situazione simile. Quello che mi ha risolto era chiamare il metodo refresh(). Ho provato anche a filo: vero e un sacco di altre cose, ma niente ha mai funzionato.

È possibile leggere l'aggiornamento here.