栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

缓存-如何与事务保持一致性

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

缓存-如何与事务保持一致性

缓存-如何与事务保持一致性
  • 什么是缓存与事务保持一致性
  • 设计思路
      • 事务内产生的数据不应该被缓存加载
      • 事务内产生的数据被缓存加载后,如果事务失败需要清除

什么是缓存与事务保持一致性

  在业务系统中会出现这样的场景,模块A与模块B的业务存在关联。场景C需要同时处理模块A和模块B的数据,先保存模块A的数据,业务流转到模块B,模块B需要查询模块A的数据。应用内部有缓存机制,会将模块A的数据加载到缓存,如果模块B的业务出现异常,则本次事务内的数据(模块A、模块B)都需要回滚,但此时模块A的数据已经被加载到缓存中,需要将该缓存清除才能保证事务与缓存数据一致。

设计思路 事务内产生的数据不应该被缓存加载
  1. 模块A数据写入时,通过线程变量将数据标识保存起来。
  2. 模块B需要模块A的数据时,判断是否在线程变量中存在所需模块A的数据标识,如果存在则不查询缓存,直接查询数据库,否则从缓存中加载。
  3. 最后不要忘记清除线程变量,避免内存泄露。

基于spring如何获取事务名称

org.springframework.transaction.support.TransactionSynchronizationManager.getCurrentTransactionName();
事务内产生的数据被缓存加载后,如果事务失败需要清除

会出现被其他线程读取到的风险,存在线程不安全,不推荐使用该方案

  1. 模块A数据写入时,发布一个事务监听事件,事务失败后执行。
  2. 模块B需要模块A的数据时,从缓存中加载。
  3. 事务失败,删除被加载到缓存的脏数据。

基于spring事件监听注解org.springframework.transaction.event.TransactionalEventListener

    @TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
	public void handle(TransactionalMessageEvent event) {
		//TODO 清除缓存数据
	}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691582.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号