我正在測試Spring的@Cacheable
功能與EHCache,但我無法找到任何關於這是否適用於Spring的@Transactional
註釋。Spring Cache抽象和JDBC DAO
我在DAO方法上放置了@Cacheable
和@CacheEvict
,而@Transactional
在服務方法上。
假設我的用戶DAO是這樣的:
時,例如,的getUser()被調用,而removeFriend()正在進行@Cacheable(value="users", key="#id")
User find(BigInteger id);
@CacheEvict(value="users", key="#user.id")
void update(User user);
@CacheEvict(value="users", key="#id")
void delete(BigInteger id);
可能會出現問題,因爲與陳舊的朋友數量的用戶會重新緩存(或不是嗎?):
public User getUser(userId) {
return userDao.find(userId);
}
@Transactional
public void removeFriend(userId, friendId) {
friendDao.remove(friendId);
user.setFriendCount(--numFriends);
userDao.update(user);
// do some other stuff
}
我怎麼能保證這不會更新數據庫事務之前緩存已經完成?除了DAO方法之外,我還會在服務方法上放置@CacheEvict
嗎?或者,我是否將讀/寫鎖定添加到服務方法?如果是這樣的鎖定,是否有任何庫基於id鎖定,因爲我只想鎖定每個用戶而不是全局鎖定,例如, @GuardedBy("userLocks.getReadLock(#userId)")
?是否有一種普遍接受的方式來處理緩存和交易?
非常感謝!
本文檔可能也有相關說明: http://ehcache.org/documentation/integrations/spring – sdouglass