多线程并发访问数据库 如何保证多线程从mysql数据库查询的数据不重复?
如何保证多线程从mysql数据库查询的数据不重复?
对于MySQL,可能会发生脏读、不可重复读和不真实读。MySQL的默认设置是repeatable read,即在一个事务中不会读取不同的数据。您可以执行以下操作:
1)打开两个客户端,两个客户端都设置为RR;
2)在一个事务中,查询一个操作以查找一段数据;例如,字段version=1中有数据;
3)在另一个事务中,删除version=1的数据;删除后,查询该事务中的数据是否为2所属没有更改,或者有版本为1的数据;
4)当我们继续更新2所属事务中的数据时,我们会发现它无法更新,并且会看到版本为1的数据。缓存一致性:缓存一致性,用什么一致性?它与数据库一致,外部查询每次都是一致的。那么,应该首先在缓存和数据库之间更新哪一个呢?有些人可能认为我可以先更新数据库,然后再更新缓存?但是你想过一个问题吗?当用户成功支付时,更新数据库,但是什么?如果你仍然显示你没有在缓存中付费,当用户频繁点击,数据库压力太大而无法同步到缓存时,你会感到尴尬吗?这是一个典型的不一致。当用户再次付费时,你告诉他已经付费了,他会骂死你。你怎么能这么做?我们可以先更新缓存,然后再更新数据库,那有什么问题?1) 缓存更新成功,但数据库更新失败,并被其他并发线程访问。2) 缓存消除成功,但数据库更新失败,也会导致后期数据不一致
这取决于方法的功能。如果方法是修改同一个变量,可能会导致线程不同步,也就是说,如果一个公共变量更改为5-1,两个线程都可以调用,结果可能是4,因为它们可能都得到5,然后它们都配对5-1,然后将值赋给原始变量。如果该方法只通过传入的参数计算返回值,不涉及修改公共变量,则没有效果
但是,当两个线程都被锁定时,如果它们包含同一个对象,则不可能同时运行,同时运行只是一种错觉。同时,只能处理一个线程
推荐Java并发编程练习本。
本书从并发和线程安全的基本概念出发,介绍如何使用类库提供的基本并发构建块来避免并发风险、构造线程安全类和验证线程安全规则。
如何将较小的线程安全类组合成较大的线程安全类,如何使用线程提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单行程序子系统的响应能力,如何确保并发程序执行预期的任务,以及如何提高并发代码的性能和可扩展性。
最后,介绍了一些高级主题,如显式锁定、原子变量、非阻塞算法以及如何开发自定义同步工具类。
总之,本书介绍完整,原理分析透彻。我希望我的回答能帮助你。
多线程并发访问数据库 多线程如何避免重复数据 多线程数据库避免重复
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。