3

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

考虑以下服务:

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方法成功执行每一行代码,然后在退出时抛出其中一个:

非法 arg 调用 java.lang.reflect.InvocationTargetException org.springframework.transaction.UnexpectedRollbackException:事务回滚,因为它已被标记为仅回滚

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

4

1 回答 1

0

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

static transactional = false
于 2013-05-09T19:16:43.570 回答