Joh*_*tle 5 service grails transactions
根据官方文档和我读过的书籍,服务是跨国的默认.但是,即使我们立即抛出RuntimeException,我们也会提交记录.
例如:
class MyService {
def someMethod() {
new someDomainObject().save(failOnError:true)
throw new RuntimeException("rollback!")
}
}
Run Code Online (Sandbox Code Playgroud)
并且这样称呼它:
class myController{
MyService myService
def someMethod() {
myService.someMethod()
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,在调用调用服务的控制器之后,然后检查是否通过使用mysql工作台附加到DB来创建行,该行确实已提交但未回滚.
所以我们接下来试过这个:
class MyService {
static transactional = true
def someMethod() {
new someDomainObject().save(failOnError:true)
throw new RuntimeException("rollback!")
}
}
Run Code Online (Sandbox Code Playgroud)
同样的问题.
接下来我们试了一下:
@Transactional
class MyService {
static transactional = true
def someMethod() {
new SomeDomainObject().save(failOnError:true)
throw new RuntimeException("rollback!")
}
}
Run Code Online (Sandbox Code Playgroud)
最后,这是有效的.但是,我们不明白为什么.
注意:使用MYSQL的Grails 2.4.4:
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:mysql://127.0.0.1:3306/db"
username = "user"
password = "***"
}
}
Run Code Online (Sandbox Code Playgroud)
这是正常的行为吗?
@Transactional与static tranasctional = true不同吗?
服务类由intellij 14使用Grails视图中Services文件夹中的"new groovy class"选项生成."新的Grails服务"选项对我们不起作用,它什么都不做,所以我们必须在正确的位置"手动"创建所有groovy类.
Joh*_*tle 10
好的,找到原因,或者知道:
"使用Transactional注释服务方法会禁用该服务的默认Grails事务行为"
所以我碰巧注释了服务中的许多方法之一 @Transactional(propagation=Propagation.REQUIRES_NEW),认为其他方法将保留其默认的事务,但是,如果你做出任何声明,它会默默地删除所有其他方法的transactoinal行为,即使你说" static transactional = true"
这似乎是相当危险的,从现在开始,我将注释每个服务类,@Transactional以避免陷入困境.
| 归档时间: |
|
| 查看次数: |
5056 次 |
| 最近记录: |