2012-09-08 20 views
6

De acuerdo con los documentos de grails, los servicios son transaccionales por defecto. Pero, sé que puede obtener un control más detallado de las transacciones mediante el uso del atributo Transactional.El uso de @Transactional deshabilita la administración de transacciones predeterminada de grails

Si tengo un servicio como

class MyService { 

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

    def method2() { } 

} 

Mi opinión es que, en este caso, habrá method1 transaccional, pero method2 no lo hará.

Si tengo

class MyService { 

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

} 

Entonces ambos method1 y method2 los dos estarán transaccional.

¿Es esto correcto?

Respuesta

6

Si usted quiere que su servicio como conjunto transaccional true la propiedad transaccional (esto no es obligatorio, pero si quieres dejar claro que el servicio es transaccional):

class MyService { 

    static transactional = true 

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

} 

Si usted no quiere a:

class MyService { 

    static transactional = false 

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

    def method2() { } 

} 

Otro ejemplo (estableciendo la propiedad transaccional no es obligatorio, pero ayuda a estar claro - si usted no es el único codificar esta):

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

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

    @Transactional 
    def updateBook() { 
     // … 
    } 

    def deleteBook() { 
     // … 
    } 
} 

Otra cosa que puede hacer es anotar toda la clase y anular los métodos que debe ser diferente:

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

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

    def updateBook() { 
     // … 
    } 

    def deleteBook() { 
     // … 
    } 
} 

Esperanza esto ayuda;)

+0

¿Qué sucede si la transacción estática no está especificada pero se utiliza la anotación @Transactional? –

+0

No hay problema, compruebe la actualización ... –

+0

Gracias, entonces, en el primer BookService, deleteBook no es transaccional, ¿correcto? –

1

puede desactivar la gestión de transacciones predeterminado Griales usando withTransaction cierre para dominios para administrar su transacción manualmente de la siguiente manera:

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

Si se produce una excepción, entonces será rollback de la transacción.

+0

Nunca entendí esta estructura. ¿Por qué está vinculado a un objeto de dominio? ¿Qué sucede si quiero tener una transacción administrada manualmente como esta, pero no relevante para un objeto de dominio particular, o perteneciente a dos objetos diferentes? ¿Cuál es la diferencia entre Rollback y RollbackOnly? ¿Solamente? –

Cuestiones relacionadas