Products
GG网络技术分享 2025-11-24 21:57 1
巨大家优良,今天我要和巨大家聊聊一个hen有用的手艺——许多线程并发读取MySQL。听起来是不是hen厉害?别急,我来磨蹭磨蹭给巨大家说明白。下面我就用我自己的方式,也就是“细小学生写作文”的方式来和巨大家分享这玩意儿手艺。
先说说我们要晓得啥是许多线程。轻巧松就是一台电脑Neng一边Zuohen许多件事情。就像我们一边吃饭一边kan电视,这就是许多线程。而并发,就是这些个事情一边开头Zuo。

我们晓得,MySQL是一个存储数据的宝库。但是Ru果我们每次只Neng一个人进去拿东西,那许多磨蹭啊!所以我们需要许多线程并发读取MySQL,就像hen许多细小朋友一起去图书馆借书一样,效率会高大hen许多。
优良,眼下我们来说说怎么实现。先说说我们需要建立一些连接。就像我们要去图书馆,先得有借书证一样。这里我用的是10个连接。这就是我们的“mysqlcon”,一个连接对应一个细小朋友。
然后我们用两个backgroundworker控件。这玩意儿geng逼真实不用定时触发。就像细小朋友不用等老师叫,自己就Neng去图书馆借书。
但是要注意哦,MySQL兴许出现脏读、不可再来一次读以及幻读。MySQL默认设置是可再来一次读,即一次事务中不会读取到不同的数据。这就是说细小朋友借书的时候,每次借的dou是同一本书。
建立一个mysql连接表加上一个, 其实Zui轻巧松的方法是用timer控件,timer控件本事就是对一个线程的封装。在一个事务中, 查询某个操作查到某份数据;比如是某个字段version=1存在数据;
缓存一致性:具体用法,我地方里有教程。NengZuo如下操作:
当要进行mysql操作时 就从表中取出一个闲置的mysql连接,并把bool量改为true,用完后改成false。临界区的Zuo用是保障一个mysql连接一次只Neng被一个线程用。
当用户Yi经支付成功了geng新鲜到数据库,但是呢?你还在缓存中kan得出来未支付, 在用户点击频率hen高大并且数据库压力过巨大,来不及同步到缓存时那你是不是hen尴尬,这就是典型的不一致了。此时用户再支付,那你又告诉他Yi经支付了那他会把你骂死的。
缓存淘汰成功,但是数据库geng新鲜输了这也会引发后期数据不一致。
那该怎么来Zuo呢?我们Neng这样,先geng新鲜缓存再geng新鲜数据库,那么存在啥问题呢?
采用共享方式打开数据库,不是以独占方式打开数据库。
打开两个客户端,均设置为RR;
通过线程的互斥来同步操作数据库。
当我们在2所属的事务中接着来geng新鲜数据, 那么会找到geng新鲜不了明明我们就kan到了这份version=1的数据;
所以你用两个timer控件就Neng模拟两个线程了。
缓存一致,与啥一致?是与数据库一致,对外查询个个时刻一致;所以在针对于缓存与数据库之间该先geng新鲜哪一个呢?兴许有人觉得我先geng新鲜数据库,再geng新鲜缓存不就行了吗?但是有想过个问题吗?
在另一个事务中, 删除这份version=1的数据;删除后在2所属的事务中查询数据是没有变来变去的,还是存在version=1的数据;
缓存geng新鲜成功,但是数据库geng新鲜输了而被其它的并发线程访问到。
临界区。
数据库采用事务处理表中的数据。
优良了这就是我给巨大家分享的许多线程并发读取MySQL的手艺。希望巨大家douNeng够学会,用起来!
Demand feedback