缓存问题
通常项目中是在保存数据时,清空缓存,从数据库获取数据时,将获取到数据同时写入到缓存中。
情况一
1、保存pojo,清除缓存;
2、通过get获取pojo对象,将pojo写入缓存;
3、处理pojo,提交到数据库;
4、提交异常,如数据库字段长度不够,导致数据无法保存,此时已经将修改后的pojo对象写入到了缓存中,但是数据库由于异常,数据没有真正写入。
5、通过get获取pojo,处理后保存到数据库,此时会将脏数据库保存到数据库中。
情况二
1、修改数据,删除缓存;
2、在事务未提交之前,另一个用户查询数据时会将旧数据写入缓存;
3、提交事务
4、获取数据时发现缓存中已存在数据,此时获取到就数据;
解决方案:
情况一、在保存时记录缓存的key,检测到异常,将缓存的key从缓存中删除。
情况二、在保存数据删除缓存时记录删除缓存的key,在事务提交后,再次从缓存中删除该key。