加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL在并发场景下的问题及解决思路

发布时间:2019-07-07 21:35:55 所属栏目:编程 来源:程序员圣经
导读:1、配景 对付数据库体系来说在多用户并发前提下进步并发性的同时又要担保数据的同等性一向是数据库体系追求的方针,既要满意大量并发会见的需求又必需担保在此前提下数据的安详,为了满意这一方针大大都数据库通过锁和事宜机制来实现,MySQL数据库也不破例

假如凭证这个要领,办理死锁是必要时刻的(即守候高出innodb_lock_wait_timeout设定的阈值),这种要领稍显被动并且影响体系机能,InnoDB存储引擎提供一个更好的算法来办理死锁题目,wait-for graph算法。简朴的说,当呈现多个事宜开始互相守候时,启用wait-for graph算法,该算法鉴定为死锁后当即回滚个中一个事宜,死锁被扫除。该要领的甜头是:搜查更为主动,守候时刻短。

下面是wait-for graph算法的根基道理:

为了便于领略,我们把死锁看做4辆车互相阻塞的场景:

MySQL在并发场景下的题目及办理思绪

MySQL在并发场景下的题目及办理思绪

4辆车看做4个事宜,互相守候对方的锁,造成死锁。wait-for graph算法道理是把事宜作为节点,事宜之间的锁守候相关,用有向边暗示,譬喻事宜A守候事宜B的锁,就从节点A画一条有向边到节点B,这样假如A、B、C、D组成的有向图,形成了环,则判定为死锁。这就是wait-for graph算法的根基道理。

总结:

1. 假如我们营业开拓中呈现死锁怎样搜查出?适才已经先容了通过监控InnoDB状态可以得出,你可以做一个小器材把死锁的记录网络起来,便于过后查察。

2. 假如呈现死锁,营业体系应该怎样应对?从上文我们可以看到当InnoDB搜查出死锁后,对客户端报出一个Deadlock found when trying to get lock; try restarting transaction信息,而且回滚该事宜,应用端必要针对该信息,干事宜重启的事变,并生涯现场日记过后做进一步说明,停止下次死锁的发生。

5、锁守候题目的说明

在营业开拓中死锁的呈现概率较小,但锁守候呈现的概率较大,锁守候是由于一个事宜长时刻占用锁资源,而其他事宜一向守候前个事宜开释锁。

MySQL在并发场景下的题目及办理思绪

从上述可知事宜1长时刻持有id=3的行锁,事宜2发生锁守候,守候时刻高出innodb_lock_wait_timeout后操纵间断,但事宜并没有回滚。假如我们营业开拓中碰着锁守候,不只会影响机能,还会给你的营业流程提出挑衅,由于你的营业端必要对锁守候的环境做顺应的逻辑处理赏罚,是重试操纵照旧回滚事宜。

在MySQL元数据表中有对事宜、锁守候的信息举办网络,譬喻information_schema数据库下的INNODB_LOCKS、INNODB_TRX、INNODB_LOCK_WAITS,你可以通过这些表调查你的营业体系锁守候的环境。你也可以用一下语句利便的查询事宜和锁守候的关联相关:

  1. SELECT R.TRX_ID WAITING_TRX_ID,  
  2.  R.TRX_MYSQL_THREAD_ID WAITING_THREAD,  
  3.  R.TRX_QUERY WATING_QUERY,  
  4.  B.TRX_ID BLOCKING_TRX_ID,  
  5.  B.TRX_MYSQL_THREAD_ID BLOCKING_THREAD,  
  6.  B.TRX_QUERY BLOCKING_QUERY  
  7. FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS W  
  8. INNER JOIN INFORMATION_SCHEMA.INNODB_TRX B ON B.TRX_ID = W.BLOCKING_TRX_ID  
  9. INNER JOIN INFORMATION_SCHEMA.INNODB_TRX R ON R.TRX_ID = W.REQUESTING_TRX_ID; 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读