大家好,我叫大鸡腿,大家可以关注下我,会持续更新技术文章还有人生感悟,感谢~
前言
现象:就是在 @Transactional 注解下一把梭哈,比如操作完数据库然后直接删缓存。
这里就会有问题:就是当事务还没提交的时候,你就把缓存删除了。导致小程序端查询把旧的数据放到缓存中。
那具体得怎么操作呢?其实之前已经写过一篇博客介绍了,这次只是使用函数式接口来方便开发,但是原理是不变的。
实现
自定义下函数式接口
@FunctionalInterface
public interface TransationCallBackFuntion {
void execute();
}
实现一个service层接口
public void transation(TransationCallBackFuntion funtion) {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@SneakyThrows
@Override
public void afterCommit() {
funtion.execute();
}
});
}
}
主要是使用事务同步管理器来注册一个适配器,在事务提交之后执行相应的操作。
具体业务调用
执行结果
在提交事务之后,我们看到数据库已经提交了操作,然后再等20秒,缓存被删除了。