使用@Transactional是否禁用grails默认事务管理

Jef*_*rey 6 grails transactions

根据grails docs,默认情况下服务是事务性的.但是,我知道您可以使用该Transactional属性获得更细粒度的事务控制.

如果我有这样的服务

class MyService {

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

    def method2() { }

}
Run Code Online (Sandbox Code Playgroud)

我的理解是,在这种情况下,method1将是交易的,但method2不会.

如果我有

class MyService {

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

}
Run Code Online (Sandbox Code Playgroud)

然后这两个method1method2都将是事务性的.

它是否正确?

Rob*_*lea 6

如果您希望将您的服务作为事务设置为true,则为事务属性(这不是强制性的,但如果您想明确该服务是事务性的):

class MyService {

    static transactional = true

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

}
Run Code Online (Sandbox Code Playgroud)

如果你不想:

class MyService {

    static transactional = false

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

    def method2() { }

}
Run Code Online (Sandbox Code Playgroud)

另一个例子(设置事务属性不是强制性的,但有助于明确 - 如果你不是唯一的编码):

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

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

    @Transactional
    def updateBook() {
        // …
    }

    def deleteBook() {
        // …
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以做的另一件事是注释整个类并覆盖您需要变化的方法:

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

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

    def updateBook() {
        // …
    }

    def deleteBook() {
        // …
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 ;)