2013-08-05 102 views
1

非事务方面,我具有了Ehcache缓存实例配置为transactionalMode="local"
现在,当我试图把一个元素在所述高速缓存中的事务之外,我得到
net.sf.ehcache.transaction.TransactionException: transaction not started的Ehcache与事务缓存

这是否意味着在事务缓存实例每次调用需要在一个事务上下文?
我在启动时正在做一些自定义高速缓存预加载,并且我不希望Ehcache事务(和copyOnRead/Write)开销。此外,因为我将处理逻辑上不可变的对象,所以我希望能够在没有事务范围的情况下从缓存中读取它们(如果可能的话)。

回答

1

你真的需要摆在首位,以使用本地事务?即,您是否需要在单个操作中原子地放置多个缓存条目?在任何情况下,如果你使用transactionalMode =“local”,你就不得不在事务边界内执行所有的缓存操作(甚至读取)

但是,如果你需要更多的粒度,你看看ehcache显式锁定,它可以用作XA事务或本地事务的自定义替代(不必在ehcache配置中指定transactionalMode)。更多在http://ehcache.org/documentation/apis/explicitlocking

希望有所帮助。

+1

我需要某种形式的全球交易,不全面的JTA。这就是为什么我最感兴趣的是本地事务的回滚机制。万一“全局事务”失败,我只需回滚所有缓存更改。是的,我正在处理需要保持一致的多个缓存级别。所以锁定会从隔离的角度来派上用场,但看起来我仍然需要自己实现回滚,对吧? – cbaby