根据grails docs,默认情况下服务是事务性的。但是,我知道您可以使用Transactional
属性对事务进行更精细的控制。
如果我有
等服务class MyService {
@Transactional(...config...)
def method1() { }
def method2() { }
}
我的理解是,在这种情况下,method1
将是交易的,但method2
则不会。
如果我有
class MyService {
def method1() { }
def method2() { }
}
然后method1
和method2
都是交易的。
这是对的吗?
答案 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()
}
}
如果抛出异常,则将回滚事务。