6

根据 grails 文档,服务默认是事务性的。Transactional但是,我知道您可以通过使用该属性对事务进行更细粒度的控制。

如果我有一项服务,例如

class MyService {

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

    def method2() { }

}

我的理解是,在这种情况下,method1将是事务性的,但method2不会。

如果我有

class MyService {

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

}

然后两者都method1method2是事务性的。

它是否正确?

4

2 回答 2

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() {
        // …
    }
}

希望这可以帮助 ;)

于 2012-09-08T16:44:37.063 回答
1

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

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

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

于 2014-10-11T05:23:33.970 回答