gpt4 book ai didi

caching - 为什么打开 @Cacheable 会导致我的事务失败?

转载 作者:行者123 更新时间:2023-12-02 21:16:01 26 4
gpt4 key购买 nike

我想将一项服务设为可缓存。我一直在研究grails-cache plugin它看起来很有希望,但它导致了一些我不理解的行为。

考虑以下服务:

class FooService {
def contentService

@Listener
void processFoo(Foo foo) {
doStuff(foo)
foo.save(failOnError: true)
}

private void doStuff(Foo foo) {
contentService.evaluate(foo.name)
}
}

现在这是 ContentService 定义:

class ContentService {
Object findSource(String name) {
Content.findByPath(name) ?: Content.findByPath(stripLocale(name))
}

String evaluate(String name) {
....
}
}

这一切都工作正常,直到我尝试添加缓存。首先,我在 Config.groovy 中进行设置:

grails.cache.config = {
cache {
name 'content'
}
}

然后在我的 ContentService 中,我注释我的方法:

@Cacheable('content')
Object findSource(String name) {
Content.findByPath(name) ?: Content.findByPath(stripLocale(name))
}

进行这些更改后,我的 processFoo 方法成功执行了每一行代码,然后在退出时抛出其中一个:

illegal arg invokation java.lang.reflect.InvocationTargetException org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

最让我困惑的是,带有 @Cacheable 注释的方法甚至没有被我的 FooService 调用。仅调用了 evaluate() 方法,并且该方法似乎没有问题。为什么将此注释添加到本次执行中未使用的方法会导致事务回滚?

最佳答案

您的 FooService 和 ContentService 真的需要在事务中运行吗?如果没有,请尝试通过将以下行添加到您的服务类来禁用服务的事务行为,看看是否有帮助:

static transactional = false

关于caching - 为什么打开 @Cacheable 会导致我的事务失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346636/

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