gpt4 book ai didi

spring - grails.gorm.transactions.Transactional不回滚

转载 作者:行者123 更新时间:2023-12-02 14:48:24 24 4
gpt4 key购买 nike

我在使用以下内容回滚服务层中的事务时遇到问题:

Grails 3.3.8

GORM 6.1.10。发布

我有以下服务方法:

import grails.gorm.transactions.Transactional

@Transactional(rollbackFor = Exception.class)
class TestingService {

void testServiceMethod(List<Factory> factories) {
try {
factories.each {
if (it.name == 'second') {
throw new Exception('second')
}
it.testField = 'Edited'
it.save()
println(it.name + ' saved')
}
} catch (Exception e) {
println('Exception Caught ' + e)
}
}
}

我还创建了以下集成测试:
@Integration
@Rollback
class TestServiceIntSpec extends Specification {

@Autowired
TestingService testingService

def setup() {
}

def cleanup() {
}

void "test something"() {
when:
Factory factoryOne = new Factory(name: "first").save(flush: true)
Factory factoryTwo = new Factory(name: "second").save(flush: true)
List<Factory> factories = [factoryOne, factoryTwo]
testingService.testServiceMethod(factories)

then:
factoryOne.testField == null
factoryTwo.testField == null
}
}

我也有以下 Controller 方法:
class TestController {

TestingService testingService

def index() {
Factory factoryOne = new Factory(name: "first").save(flush: true)
Factory factoryTwo = new Factory(name: "second").save(flush: true)
List<Factory> factories = [factoryOne, factoryTwo]
testingService.testServiceMethod(factories)
println "First Factory: $factoryOne.testField"
println "First Factory: $factoryTwo.testField"
render 'Check Console'
}
}

我本以为测试会通过,因为我认为在抛出新异常后,事务将回滚,但是it.testField仍然存在吗?另外,当我对TestController执行ping操作时,它会将factoryOne.testField输出为“已编辑”。我是否从文档中正确地理解了这一点?

“服务启用事务划分,这是定义将哪些方法变为事务性的声明方式。要在服务上启用事务,请使用事务转换:
结果是所有方法都包装在事务中,并且如果方法抛出异常(包括Checked或Runtime异常)或Error,则会发生自动回滚。”

资料来源: https://docs.grails.org/latest/guide/services.html#declarativeTransactions

我也看不到我在做什么,而与此其他Stackoverflow答案不同:

https://stackoverflow.com/a/25739582/6887293

可以通过拉出以下Github项目并运行/factory/factory/src/integration-test/groovy/com/mycompany/myapp/TestServiceIntSpec.groovy或ping / factory / factory / grails-app / controllers / com /来重新创建此问题。 mycompany / myapp / TestController.groovy

https://github.com/georgy3k/IntegrationTestRollBack/tree/8addd2b95a8ffa4570e70eccb3b023b0ccfef5aa

提前致谢 ...

最佳答案

在您的catch块中,您需要重新引发异常。

catch (Exception e) {
println('Exception Caught ' + e)
throw e;
}

我所看到的问题是,异常永远不会逸出该方法。

关于spring - grails.gorm.transactions.Transactional不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53212858/

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