场景
我们经常会遇到一些操作为数据库,然后删除缓存的操作。然后在操作数据库的时候就加上了事务 @Transational ,结果就会遇到一些坑,就是数据库事务提交之后,查到的缓存还是旧的。
场景还原
当事务里面sql处理执行完之后,实际上还没提交的,这时删除缓存,是已经执行的。然后这时如果别人查询旧的数据会将旧数据放到缓存里头,这下就gg了。
想法
我们应该是执行完sql,提交事务,再进行删除缓存是吧。
方案
在黑神的文章里头讲了两个方案
1)就是把删除缓存放在事务外面
2)因为使用了@CacheEvict,所以修改@Order来修改aop执行的顺序。
介绍另一种方案
上代码
if(TransactionSynchronizationManager.isSynchronizationActive()){
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
System.out.println("commit over...");
}
});
}
先判断是否是在事务里头,是的话等事务提交之后进行相关操作。
如果是在事务外,是不起效果的。