Java中高并发下怎么保证数据一致性

Java中高并发下怎么保证数据一致性,第1张

以mysql来说,可能出现脏读、不可重复读以及幻读,mysql默认设置是可重复读,即一次事务中不会读取到不同的数据

可以做如下 *** 作:

1)打开两个客户端,均设置为RR;

2)在一个事务中,查询某个 *** 作查到某份数据;比如是某个字段version=1存在数据;

3)在另一个事务中,删除这份version=1的数据;删除后,在2所属的事务中查询数据是没有变化的,还是存在version=1的数据;

4)当我们在2所属的事务中继续更新数据,那么会发现更新不了,明明我们就看到了这份version=1的数据;

缓存一致性:

缓存一致,与什么一致?是与数据库一致,对外查询每个时刻一致;所以在针对于缓存与数据库之间该先更新哪一个呢?可能有人觉得我先更新数据库,再更新缓存不就行了吗?但是有想过个问题吗?

当用户已经支付成功了,更新到数据库,但是呢?你还在缓存中显示未支付,在用户点击频率很高并且数据库压力过大,来不及同步到缓存时,那你是不是很尴尬,这就是典型的不一致了。此时用户再支付,那你又告诉他已经支付了,那他会把你骂死的

那该怎么来做呢?我们可以这样,先更新缓存再更新数据库,那么存在什么问题呢?

1)缓存更新成功,但是数据库更新失败,而被其它的并发线程访问到

2)缓存淘汰成功,但是数据库更新失败,这也会引发后期数据不一致

这是一个高并发,多线程问题

如果数据粒度没有设计到行级锁,

比方说A这条记录 是100,并发情况下两个人拿到A记录100 一个更新为70,一个更新为80

实际是拿走了50的量,但是因为是并发情况 导致数据不正确。所以这个地方是一个数据锁的概念,至于为什么会这样,道理也很简单,一个排队做事情,一个并行做事情,能一样吗?

有一个思路,你可以用ajax局部刷新数据,不刷新整个页面,同时用缓存,例如第一个30秒的数据放入缓存,页面从缓存里取数据,第二个30秒,你从数据库取出数据后,写个对象对比的方法,来比对新数据和第一个30秒存入缓存的数据,如果数据没有改变,那页面什么 *** 作也不用做,因为数据没变化,刷新也没意义,如果第二个30秒数据发生变化,那么就刷新缓存为第二个30秒的数据,并且局部刷新页面数据。数据库的查询是避免不了的,所以没发减轻数据库的压力,只能是优化数据的显示。就象我上边提到的,如果前后2个30秒数据没有变化,那么就不要刷新页面。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6614735.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-25
下一篇 2023-03-25

发表评论

登录后才能评论

评论列表(0条)

保存