2013-05-02 128 views
3

我有一個服務,我想緩存。我一直在尋找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()方法,並且該方法似乎沒有問題。爲什麼要將這個註解添加到一個甚至沒有在這個執行中使用的方法會導致事務回滾?

+0

你看到用'grails.cache.proxyTargetClass'配置選項設置相同的行爲到'真的'? – 2013-05-02 23:06:49

+0

@Andrew:是的,與此設置相同的行爲。 – Samo 2013-05-03 13:13:20

+0

@Samo你有沒有找到這種行爲的原因? – Thihara 2015-01-01 09:57:26

回答

0

您的FooService和ContentService真的需要在事務中表現嗎?如果沒有,請嘗試禁用服務的事務行爲通過添加以下到您的服務類行,看看它是否幫助:

static transactional = false 
相關問題