专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

java为何会产生脏数据_数据库

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/3/5 13:07:59       共计:3573 浏览
java为何会产生脏数据?

什么是脏数据,脏数据就是过期的数据;

为什么会出现脏数据,根本原因还是数据没有同步,归根结底其实就是数据一致性问题,怎么保证数据的一致性这本身就是一个难题;我们平时会遇到哪些脏数据的情况,该如何解决;

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/

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:mysql性别用什么类型_数据库 | ·下一条:计算2个datetime类型的字段_数据库

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有