我正在@Cacheable
使用 EHCache 测试 Spring 的功能,但我找不到任何关于这是否适用于 Spring 的@Transactional
注释的信息。
我在服务方法上@Cacheable
放置@CacheEvict
DAO方法。@Transactional
假设我的用户 DAO 看起来像这样:
@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);
例如,当在 removeFriend() 过程中调用 getUser() 时可能会出现问题,因为具有过时好友计数的用户将被重新缓存(或者会吗?):
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
}
如何确保在数据库事务完成之前不会更新缓存?@CacheEvict
除了 DAO 方法之外,我还放置服务方法吗?或者,我是否向服务方法添加读/写锁定?如果是这样锁定,是否有任何库可以基于 id 锁定,因为我只想锁定每个用户而不是全局锁定,例如@GuardedBy("userLocks.getReadLock(#userId)")
?是否有一种普遍接受的方式来处理缓存和事务?
非常感谢!