Java高并发防止数据重复 在多线程处理表数据的时候怎么防止数据被重复处理?
在多线程处理表数据的时候怎么防止数据被重复处理?你好,我是[用户4229663898417]。我很高兴为你回答。这可以通过数据修改的时间来判断。例如,表中有一个字段read time。当客户端读取10
在多线程处理表数据的时候怎么防止数据被重复处理?
你好,我是[用户4229663898417]。我很高兴为你回答。这可以通过数据修改的时间来判断。例如,表中有一个字段read time。当客户端读取10条数据时,将读取时间更新为当前时间。然后下一个客户看的时候,判断时间在半小时之内,没有更新的数据。没关系。然而,这其中有一个坏处。很可能第一个客户在半小时内仍会使用这十条数据。如果是修改数据,所有者可以使用锁定功能锁定数据库表,这样就不用担心重复提交。希望您能尽快解决问题~~~有更多专业的科学知识,欢迎关注我。如果你喜欢我的回答,也请给我表扬或转发,你的鼓励是支持我写下来的动力,谢谢。
如何保证多线程从mysql数据库查询的数据不重复?
对于MySQL,可能会发生脏读、不可重复读和不真实读。MySQL的默认设置是repeatable read,即在一个事务中不会读取不同的数据。您可以执行以下操作:
1)打开两个客户端,两个客户端都设置为RR;
2)在一个事务中,查询一个操作以查找一段数据;例如,字段version=1中有数据;
3)在另一个事务中,删除version=1的数据;删除后,查询该事务中的数据是否为2所属没有更改,或者有版本为1的数据;
4)当我们继续更新2所属事务中的数据时,我们会发现它无法更新,并且会看到版本为1的数据。缓存一致性:缓存一致性,用什么一致性?它与数据库一致,外部查询每次都是一致的。那么,应该首先在缓存和数据库之间更新哪一个呢?有些人可能认为我可以先更新数据库,然后再更新缓存?但是你想过一个问题吗?当用户成功支付时,更新数据库,但是什么?如果你仍然显示你没有在缓存中付费,当用户频繁点击,数据库压力太大而无法同步到缓存时,你会感到尴尬吗?这是一个典型的不一致。当用户再次付费时,你告诉他已经付费了,他会骂死你。你怎么能这么做?我们可以先更新缓存,然后再更新数据库,那有什么问题?1) 缓存更新成功,但数据库更新失败,并被其他并发线程访问。2) 缓存消除成功,但数据库更新失败,也会导致后期数据不一致
简要说明以下原因:
锁定是因为操作不是原子的。让我们把我的手术作为一个解释。参见下面两个图。
我这个操作需要
看上面的第二个图,你能很清楚地理解这个过程吗?
锁定是为了确保上述三个步骤是原子操作。
回到问题上来,只有一个线程要写,没有竞争,所以不需要锁定。
但是,如果你看第一张图片,因为主内存和本地内存的存在
在一个线程写入后,其他线程无法立即看到它。这就是可见性问题。
添加volatile关键字后,它将在操作后强制工作内存和主内存同步,以确保其他线程可以立即看到它。