2012-06-03 16 views
5

Mam usługę Grails, która jest oznaczona jako transakcyjna i ma wiele rzeczy.Problemy z transakcjami Grails

dodaję kod do tej metody i nie uzyskanie wyników, które mam się spodziewać, kiedy krok po kroku go:

  1. Mam kod, który wywołuje .save(), które nie mogą być postrzegane w backend MySQL aż cała metoda kończy. Tego właśnie oczekiwałbym, biorąc pod uwagę, że metoda obsługi jest transakcyjna.
  2. Mam inny kod, który wywołuje .save(), który można zobaczyć w MySQL przed zakończeniem metody serwisowej. Nie rozumiem tego i nie rozumiem rozbieżności między tym i 1.
  3. Mam jeszcze więcej kodu, który używa groovy.sql.Sql do wstawienia do bazy danych. Zgaduję, że jest to poza przetwarzaniem transakcji Grails, więc fakt, że to zobowiązuje się przed zakończeniem metody ma sens. Czy mogę uzyskać Grailsa do zarządzania tym wewnątrz transakcji?

Proszę odrzucić wszelkie błędy w moich założeniach. Oto odpowiedni kod:

Główne usługi Metoda

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) 

dodałem flush:true aby równo, ale teraz rozumiem, że tylko do spłukiwania hibernacji, ale w rzeczywistości nie popełnić transakcję, ponieważ jest transakcyjny. Co ja robię źle?

+0

Nie jest jasne, co dzieje się z kodem, który publikujesz, i wydaje mi się, że łamiesz konwencje. Z jednego kontekstu transakcyjnego (wywołania metody grails) celowo próbujesz wyrwać się z transakcji? Ponadto, dlaczego zmuszasz kolor? –

+0

@HansWesterbeek Nie próbowałem zerwać z żadną transakcją - po prostu patrzę na kod, który odziedziczyłem i próbuję nadać mu sens. Zmusiłem kolor jako test (ponieważ wtedy go nie rozumiałem), ale zamierzam go usunąć.Nic (poza obecną metodą 'createResults', która działa poza transakcją) powinno się zatwierdzać do momentu zatwierdzenia pełnej transakcji, prawda? – skaz

Odpowiedz

7

można dostać groovy.sql.Sql uruchomiony w transakcji, która metoda usługa jest przy użyciu przy użyciu Sql constructor that takes a connection argument zamiast:

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

To powinno rozwiązać problem uzyskiwanie danych zaangażowana w różnym czasie w tej samej metody usługi.

+0

Dzięki - to z pewnością rozwiąże część mojego problemu! – skaz

0

Byłem w podobnej sytuacji. Rozwiązałem to dla mnie, nazywając metodę refresh(). Próbowałem również flush: prawda i mnóstwo innych rzeczy, ale nic nie działało.

Możesz przeczytać o odświeżaniu here.

Powiązane problemy