2012-09-08 13 views
6

Zgodnie z dokumentacją grails, usługi są domyślnie transakcyjne. Ale wiem, że możesz uzyskać dokładniejszą kontrolę transakcji za pomocą atrybutu Transactional.Czy używanie @Transactional wyłącza domyślne zarządzanie transakcjami Grails

Jeśli mam usługi, takie jak

class MyService { 

    @Transactional(...config...) 
    def method1() { } 

    def method2() { } 

} 

moim rozumieniu jest to, że w tym przypadku, method1 będzie transakcyjny, ale method2 nie będzie.

Jeśli mam

class MyService { 

    def method1() { } 
    def method2() { } 

} 

Wtedy zarówno method1 i method2 będzie zarówno być transakcyjnej.

Czy to prawda?

Odpowiedz

6

Jeśli chcesz, aby Twój serwis jako transakcyjnej ustawiona na true nieruchomości transakcyjnej (nie jest to obowiązkowe, ale jeśli chcesz, aby wyjaśnić, że usługa jest transakcyjny):

class MyService { 

    static transactional = true 

    def method1() { } 
    def method2() { } 

} 

Jeśli nie chcesz do:

class MyService { 

    static transactional = false 

    @Transactional(...config...) 
    def method1() { } 

    def method2() { } 

} 

Kolejny przykład (ustawienie nieruchomość transakcyjna nie jest obowiązkowe, ale pomaga być jasne - jeśli nie są to jedyne kodowanie):

import org.springframework.transaction.annotation.Transactional 
class BookService { 

    @Transactional(readOnly = true) 
    def listBooks() { 
     Book.list() 
    } 

    @Transactional 
    def updateBook() { 
     // … 
    } 

    def deleteBook() { 
     // … 
    } 
} 

Inną rzeczą, jaką możesz zrobić, to opisywanie całą klasę i zastąpić metody musisz być różne:

import org.springframework.transaction.annotation.Transactional 
@Transactional 
class BookService { 

    @Transactional(readOnly = true) 
    def listBooks() { 
     Book.list() 
    } 

    def updateBook() { 
     // … 
    } 

    def deleteBook() { 
     // … 
    } 
} 

Nadzieja to pomaga;)

+0

Co się stanie, jeśli statyczna transakcja nie zostanie określona, ​​ale zostanie użyta adnotacja @Transactional? –

+0

Bez problemu sprawdź aktualizację ... –

+0

Dzięki, więc w pierwszej BookService deleteBook nie jest transakcyjny, prawda? –

1

Można wyłączyć Grails domyślną obsługę transakcji przy użyciu withTransaction zamknięcie dla domen zarządzać transakcja ręcznie w następujący sposób:

Account.withTransaction { status -> 
    try { 
     //write your code or business logic here 
    } catch (Exception e) { 
     status.setRollbackOnly() 
    } 
} 

Jeśli jest wyjątek, wówczas transakcja będzie rollbacked.

+0

Nigdy nie zrozumiałem tej struktury. Dlaczego jest powiązany z obiektem domeny? Co się stanie, jeśli chcę mieć ręcznie zarządzaną transakcję taką jak ta, ale nieistotną dla konkretnego obiektu domeny lub odnoszącą się do dwóch różnych obiektów? Jaka jest różnica między Rollback i Rollback Only. Tylko? –

Powiązane problemy