博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存+事务 使用问题
阅读量:5932 次
发布时间:2019-06-19

本文共 745 字,大约阅读时间需要 2 分钟。

背景

消息中间件为activeMq

事务回滚时消息无法回滚

有频繁的查询缓存操作

场景1

@Transactionalvoid xxxMethod(){    clearCache();------#1    dealData();------#2    sendMessage();}复制代码

以上代码会出现缓存和数据库不一致情况

原因分析

在#1、#2操作之间 有查询缓存操作,把脏数据写入缓存,导致缓存和数据库数据不一致

场景2

处理完数据以后再清除缓存,保证缓存和数据库的最终一致性

@Transactionalvoid xxxMethod(){    dealData();------#1    clearCache();------#2    sendMessage();    ....}------#4@Overridepublic void handleMessage(MessageVO messageVO) {   ....   getCache();------#3}复制代码

为场景1的进阶版本,依旧会出现缓存和数据库不一致情况

原因分析

在#2、#4之间有缓存的查询操作,可能为消息处理类的操作#3,也可能为外部查询请求。 由于事务未提交,数据库的数据为更新,导致缓存加载的依旧是旧数据,从而导致缓存和数据库的数据不一致。

解决方案

void xxxMethod(){    xxxMethod();    clearCache();    sendMessage();}@Transactionalvoid xxxMethod(){    dealData();    ....}复制代码

只能保证缓存和数据库的最终一致性,高并发情况下可能有瞬间的数据错误。

转载地址:http://inytx.baihongyu.com/

你可能感兴趣的文章
SQL Server为啥使用了这么多内存?
查看>>
用Canvas写一个炫酷的时间更新动画玩玩
查看>>
用最简单的例子理解适配器模式(Adapter Pattern)
查看>>
Python网络爬虫 - 下载图片
查看>>
SVN代码行数统计
查看>>
浅析 Hinton 最近提出的 Capsule 计划
查看>>
收获,不止Oracle
查看>>
HDU 5030 Rabbit's String
查看>>
协程Coroutine
查看>>
微软再次警告IE安全漏洞成为攻击目标
查看>>
URI和URL“.NET研究”及URN的区别
查看>>
李永京(YJingLee)的NHibernate之旅系列文章导航
查看>>
cocos2dx 3.x版本搭建Mac环境工程(创建一个新的C++工程)百分百可行
查看>>
wince -- firstboot.nb0 的大小的问题解决
查看>>
[JavaScript] 兼容IE、FireFox、Chrome等浏览器的xml处理函数(xml同步/异步加载、xsl转换、selectSingleNode、selectNodes)...
查看>>
android-铃声的设置与播放
查看>>
iPhone开发教程之相关的plist文件
查看>>
JSF---->表格处理
查看>>
【MSDN 目录】C#编程指南、C#教程、ASP.NET参考、ASP.NET 4、.NET Framework类库
查看>>
[ZZ]From QA to Engineering Productivity
查看>>