什么是脏数据,脏数据就是过期的数据;
为什么会出现脏数据,根本原因还是数据没有同步,归根结底其实就是数据一致性问题,怎么保证数据的一致性这本身就是一个难题;我们平时会遇到哪些脏数据的情况,该如何解决;
1.多线程同时操作变量
比如多个线程同时操作一个变量,有线程set值,有线程get值;如果不用synchronized等关键字会出现脏数据的情况;这主要和java的内存模型有关;
2.操作数据库导致脏数据
比如同时往数据库插入两条记录,如果没有事务来保证数据同时成功和同时失败,就可能会出现脏数据;
3.缓存脏数据
比如我们经常会用到缓存,保存数据库的时候保存一份到缓存中,更新数据库的时候也同时更新缓存,这样取数据的时候直接从缓存获取数据即可;如果不能保证数据同步缓存和数据库也会出现脏数据;
4.分布式事务
比如最常见的跨行转账问题,如果没有分布式事务,就可能出现脏数据;
5.数据同步
数据同步可以说是数据一致性问题最好的例子了,比如mysql主从同步,zk数据同步;这其实要牵扯出一个基础理论CAP理论,主要内容如下:
一个分布式系统不可能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),为什么这么说其实可以给出证明的:
这里可以做一个简单的证明:
前提:对于一个分布式系统而言,分区容错性可以说是一个最基本的要求。因为既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,否则也就无所谓分布式系统了;
假设网络中有2个节点N1和N2,N1和N2上分别安装了数据库D1(主)和D2(备)形成主备模式,D1(主)负责写并且读,D2(备)分担一部分读
正常情况下:D1(主)写完数据,同步到D2(备),读取D2可以读到最新的数据
非正常情况下:作为一个分布式系统,它和单机系统的最大区别,就在于网络,现在假设一种极端情况,N1和N2之间的网络断开了;D1(主)写完数据,D2(备)没有更新到最新的数据;这时候怎么办,有2个选择:第一,牺牲数据一致性,响应旧的数据给用户;第二,牺牲可用性,阻塞等待,直到网络连接恢复,数据更新操作完成之后,再给用户响应最新的数据。
所以可以看到主流的一些中间件在数据一致性问题上其实都是在AP和CP直接抉择的,比如zk更倾向于CP,eruaka更倾向于AP;
更多可以关注本人的相关文章:
从ACID到CAP/BASE
https://www.toutiao.com/i6748644401506943499/
2PC/3PC到底是啥
https://www.toutiao.com/i6748710371780985348/
Paxos算法浅析
https://www.toutiao.com/i6748725707750244877/
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有