我有一個服務,我想緩存。我一直在尋找grails-cache plugin,它看起來非常有前途,但它造成了一些我不明白的行爲。爲什麼打開@Cacheable會導致我的事務失敗?
考慮以下服務:
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 invokation java.lang.reflect.InvocationTargetException org.springframework.transaction.UnexpectedRollbackException:012因爲它已被標記爲只回滾
我什麼混淆了最大約這是與@Cacheable
註釋的方法不是由我FooService
甚至稱事務回滾。只調用evaluate()
方法,並且該方法似乎沒有問題。爲什麼要將這個註解添加到一個甚至沒有在這個執行中使用的方法會導致事務回滾?
你看到用'grails.cache.proxyTargetClass'配置選項設置相同的行爲到'真的'? – 2013-05-02 23:06:49
@Andrew:是的,與此設置相同的行爲。 – Samo 2013-05-03 13:13:20
@Samo你有沒有找到這種行爲的原因? – Thihara 2015-01-01 09:57:26