gpt4 book ai didi

spring - 如何使用传播 REQUIRES_NEW 等待事务提交

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

我想集成测试一个调用使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 的方法的服务方法.但是,基于内部(新)事务的断言失败。

class MyService {

@Transactional(propagation = Propagation.NESTED)
def method1() {
method2()
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
def method2() {
// some code that will modify the DB
}
}

class MyServiceNonTransactionalIntegrationSpec extends IntegrationSpec {
static transactional = false

def myService = new MyService()

setup() {
// populate database here
}

cleanup() {
// teardown database here after tests complete
}

def method1() {
when: "we test the main method"
myService.method1()

then: "we should be able to see the result of method 1 and method 2"
// BUT: (!!!)
// assertions based on state of database fail, perhaps because new transaction
// wrapped around method 2 has not yet committed
}
}

我如何集成测试 method1() ?

编辑:

为了解决代理问题,我尝试了以下方法,但仍然无法正常工作:
class MyService {

def myService2

@Transactional(propagation = Propagation.NESTED)
def method1() {
myService2.method2()
}
}

class MyService2 {

@Transactional(propagation = Propagation.REQUIRES_NEW)
def method2() {
// some code that will modify the DB
}
}

class MyServiceNonTransactionalIntegrationSpec extends IntegrationSpec {
static transactional = false

def myService = new MyService()
def myService2 = new MyService2()

setup() {
myService.myService2 = myService2
// populate database here
}

// rest as before
}

最佳答案

如果您使用 org.springframework.transaction.annotation.Transactional,这只是一个自调用问题。 - 你应该使用 @grails.transaction.Transactional相反,它具有相同的配置选项,但使用 AST 转换而不是运行时代理,以避免不调用代理方法的问题。使用 Grails 注释时,每个方法都被重写以模拟为每个方法创建代理,将代码包装在基于该方法的注释设置配置的事务模板中(在方法上显式,或从类范围注释推断) )。

但是你的测试被破坏了,因为你正在使用 new创建服务。始终在集成测试中使用依赖注入(inject),以便获得配置的 Spring bean,而不仅仅是新的未初始化 POGO。为此,请在测试之外添加相同的属性语法:

def myService
def myService2

并删除 Spring 为您执行的不必要的接线代码(例如 myService.myService2 = myService2 )。

关于spring - 如何使用传播 REQUIRES_NEW 等待事务提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29771925/

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