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

时间:2012-09-08 16:41:31

标签: grails transactions

根据grails docs,默认情况下服务是事务性的。但是,我知道您可以使用Transactional属性对事务进行更精细的控制。

如果我有

等服务
class MyService {

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

    def method2() { }

}

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

如果我有

class MyService {

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

}

然后method1method2都是交易的。

这是对的吗?

2 个答案:

答案 0 :(得分:6)

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

class MyService {

    static transactional = true

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

}

如果您不想:

class MyService {

    static transactional = false

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

    def method2() { }

}

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

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

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

    @Transactional
    def updateBook() {
        // …
    }

    def deleteBook() {
        // …
    }
}

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

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

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

    def updateBook() {
        // …
    }

    def deleteBook() {
        // …
    }
}

希望这会有所帮助;)

答案 1 :(得分:1)

您可以使用域withTransaction关闭来禁用Grails默认事务管理,以便手动管理您的事务,如下所示:

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

如果抛出异常,则将回滚事务。