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:
- 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. - 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. - 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?
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? –
@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