gpt4 book ai didi

spring - 在 Grails 服务中回滚事务

转载 作者:IT老高 更新时间:2023-10-28 13:56:44 25 4
gpt4 key购买 nike

我一直在使用 Grail 在服务中引发 RuntimeException 时回滚的能力将我的所有服务更新为事务性服务。在大多数情况下,我会这样做:

def domain = new Domain(field: field)
if (!domain.save()) {
throw new RuntimeException()
}

无论如何,我想验证这确实会回滚事务......它让我思考此时它是否已经被提交......另外,如果没有,设置 flush:true 会改变吗?我对 Spring/Hibernate 是如何做到这一切的不是很熟悉 :)

最佳答案

是的,这样就可以了。

Grails 中的事务默认在服务方法级别处理。如果方法正常返回,则事务将被提交,如果抛出 RuntimeException,则事务将回滚。

请注意,这意味着即使您在服务器方法中保存对象时使用 flush:true on,如果您抛出 RuntimeException,数据库更改仍将回滚。

例如:

class MyService {

def fiddle(id,id2){
def domain = Domain.findById(id)

domain.stuff = "A change"
domain.save( flush:true ) // will cause hibernate to perform the update statements

def otherDomain = OtherDomain.findById(id2)

otherDomain.name = "Fiddled"

if( !otherDomain.save( flush:true )){ // will also write to the db
// the transaction will be roled back
throw new RuntimeException("Panic what the hell happened")
}
}
}

我对 Grails 不是 100% 清楚的是,如果在直接 java/spring 世界中抛出检查异常会发生什么情况,默认行为是事务启动器提交事务,尽管这可以在配置中被覆盖.

注意:有一个警告,那就是您的数据库必须支持您正在更新的表上的事务。是的,这是在戳 MySQL :)

这也适用于 Domain.withTransaction 方法。

关于spring - 在 Grails 服务中回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com