美文网首页
高并发下的mysql问题

高并发下的mysql问题

作者: Dr點燃 | 来源:发表于2017-12-26 15:30 被阅读211次

高并发下的mysql问题

mysql 重复插入问题

业务需要先根据where条件查询,如有数据命中对其进行修改否则创建一条新的记录。实践中发现:该操作在遇到并发处理时会发生重复创建

解决方式

添加唯一索引或多列唯一索引,这样当有重复创建时数据库报错,交由程序处理。这种处理方式为乐观锁,适合冲突发生率比较低的情况。

mysql set update 并发脏读问题

对一条数据进行累加时常常先使用select语句查询,然后在查询的数值上加上一个数值,在update 更新回数据库。 这样操作在并发处理中会出现脏读问题,例如:两个进程同时处理相同一条数据,同时读取了当前的数值为200,进程1处理的比较快在2000的基础上加上了3000(2000 + 3000),更新回数据库(此时数据为5000),进程2也在原2000基础上加上了2000(2000 + 2000),也更新会数据库。最终数据库数值为4000,正确的应为2000+3000+2000=7000.

解决方法

对数据加独占锁:

共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。

排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。

在这个问题中,我们采用排他锁对需要修改的数据加锁,这样在整个查询、修改的事务执行过程中,其他事务将无法读取数据,直到该事务处理完毕。这种操作方式为悲观锁。 将并行处理改为串行处理。

SQLAlchemy 的 Query 支持 select ... for update / share .

session.Query(User).with_for_update().first()
session.Query(User).with_for_update(read=True).first()

完整形式是:

with_for_update(read=False, nowait=False, of=None)

read

是标识加互斥锁还是共享锁. 当为 True 时, 即 for share 的语句, 是共享锁. 多个事务可以获取共享锁, 互斥锁只能一个事务获取. 有"多个地方"都希望是"这段时间我获取的数据不能被修改, 我也不会改", 那么只能使用共享锁.

nowait

其它事务碰到锁, 是否不等待直接"报错".

of

指明上锁的表, 如果不指明, 则查询中涉及的所有表(行)都会加锁.

相关文章

  • 高并发下的mysql问题

    高并发下的mysql问题 mysql 重复插入问题 业务需要先根据where条件查询,如有数据命中对其进行修改否则...

  • 高并发与缓存

    本文主要讲述高并发下缓存会出现的问题。 在高并发下,缓存会出现的问题有:缓存一致性、并发问题、穿透问题、缓存的雪崩...

  • mysql多线程update死锁问题

    最近想起之前处理过的一个mysql 死锁问题,是在高并发下update批量更新导致的,这里探讨一下发生的原因,以及...

  • Mysql写入频繁,怎么破?这是我见过的最清晰的“神操作”

    Mysql在写入压力很大,怎么办? 高并发下的性能最大的问题,大都在数据库,以前我们做二十万超级群,mongodb...

  • 2019-03-17

    elasticsearch-head MySQL挑战:建立10万连接 取代 ZooKeeper!高并发下的分布式一...

  • CDH 配置Mysql高可用:主从和keepalived

    问题描述:配置CDH 配置Mysql高可用,并实现和cdh无缝对接。 主从和keepalived配置步骤:网上很多...

  • 高性能无锁并发框架Disruptor,太强了

    Disruptor是一个开源框架,研发的初衷是为了解决高并发下队列锁的问题,最早由LMAX提出并使用,能够在无锁的...

  • 一些基础之一

    高并发 面试的时候都喜欢问这个问题,解决高并发的问题根源在于解决高并发下共享资源的控制问题。也就牵扯到多线程下共享...

  • 高并发下用户抢购问题简答

    高并发下用户抢购问题简答 前言 面试题当中如何处理高并发用户抢购问题可以说是一个十分经典的问题,经常被提及,在这就...

  • 高并发下Redis缓冲穿透问题

    一、使用场景我们在日常的开发中,经常会遇到查询数据列表的问题,有些数据是不经常变化的,如果想做一下优化,在提高查询...

网友评论

      本文标题:高并发下的mysql问题

      本文链接:https://www.haomeiwen.com/subject/achjgxtx.html