
数据一致性主要有这些方面
一致性:
对于mysql,可能有脏读,不可重复读和魔术读. mysql的默认设置是可重复读取,即在事务中不会读取不同的数据.
如果我们设置为RC(即已提交读取),则当并行执行两个事务时,可能看起来其中一个事务尚未执行,而另一个事务已执行,则它将引起不可重复的读取问题;
当我们设置为READUNCOMMITTED(即未提交读取)时,问题就更大了. 事务之一尚未执行. 读取在另一个事务中间更改的数据. 假设另一笔交易回滚,则会出现脏读;

但是呢?并不是说RR可以完全正常,RR可能是幻影.
您可以执行以下操作:
1)打开两个客户端并将它们设置为RR;
2)在事务中,查询特定操作以查找特定数据;例如,在字段version = 1中有数据;
3)在另一笔交易中,删除此version = 1数据;删除后,检查2所属的事务中的数据是否不变,或者是否有version = 1数据;

4)当我们继续更新2所属的事务中的数据时,我们将发现它无法更新. 显然,我们看到了这个版本= 1的数据;
这是幻影阅读.
那么什么是安全性?
假设情况是用户为该模块付费,则这需要高度的一致性. 此时,假设我们有两个表,一个是订单表,另一个是用户帐户余额表;假设用户已经订购了两笔付款(不要告诉我您必须输入付款密码,我认为还是很快速的),那么我们通常的逻辑是先检查订单,如果不是支付,那么我们将扣除余额,但是我们可以简单地扣除吗?安全吗?如上面的模拟,如果以前的付款已经成功付款,但是我们当前的付款仍然可以重新读取,即使付款已经在外面成功付款,但是我们仍然直接扣除余额,那么将会出现重复的扣除情况,以确保用户下次想打你,信不信由你.
那正确的方法是什么?当然,您必须在更新过程中携带付款状态,然后它将返回update = 0,我们也知道已经付款,即使支票时未付款,也无法,由于高并发性,因此无法使用笨重的Serialize.

缓存一致性:
缓存是一致的,它与什么一致?它与一致,并且外部查询在每时每刻都一致;那么应该首先在缓存和之间更新哪个?有人可能认为我需要先更新,然后再更新缓存. 但是您是否考虑过问题?
当用户成功付款后,更新到,但是怎么办?您仍在缓存中显示未付款. 当用户频繁单击并且压力太大而无法同步到缓存时,您感到尴尬吗?这是典型的不一致. 这时用户再次付款,然后您告诉他他已经付款,然后他会骂您到死.
那我该怎么办?我们可以这样做,首先更新缓存,然后更新,那是什么问题呢?
1)缓存更新成功,但更新失败,但被其他并发线程访问

2)缓存已成功清除,但是更新失败,这也将导致以后的数据不一致
对于这一部分,我的想法是,当我读取数据时,首先要从缓存中获取数据,然后再将其保存到中. 但是,当我们更新时,我们可以保持的一致性,即更新或插入先前的写入,然后主动异步消除缓存,以便即使在中存在不一致的情况下,中心也位于中阅读,也就是说,处于更改的中间状态,但是又是什么呢?缓存尚未消除. 但是,与其他2pc和3pc重量保证相比java缓存并发,它要好得多,但是可以考虑Ali刚刚发布的paxos库,以了解如何将其应用于缓存和的同步;但对于我们来说,请考虑第一个被认为是好的解决方案.
要同时读取此内容,我们可能需要考虑一个问题,即太多的请求通过高速缓存来读取. 这是一个典型的缓存故障问题. 此时,缓存过期功能用于模拟锁定. 漏斗库与番石榴结合使用是更合适的解决方案.
当然,数据的一致性是什么?当前,最好的方法是分布式一致性解决方案java缓存并发,即paxos,它不是唯一的,只是场景.
对于这部分缓存,我建议使用Chen Hao的炫酷Shell缓存更新例程| | Cool Shell-CoolShell站在上帝的肩膀上,慢慢窥视并发之美.
花点时间写答案,像这样. 有趣的脸.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-271191-1.html
应该向小米公司以及消费者正式道歉
挺好