多线程高并发编程
夜风_BLOG
这个作者很懒,什么都没留下…
展开
-
并发更新引发的死锁问题排查
背景知识:MySQL有三种锁的级别:页级、表级、行级。MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。MySQL这3种锁的特性可大致归纳如下:表级锁:开销小,...转载 2018-05-17 20:51:11 · 9897 阅读 · 6 评论 -
并发更新不同表引发的死锁问题排查
先来一波异常日志再来一波原因分析 如图A,B两事物同时执行更新表1,2,顺序分别位A(1,2),B(2,1)。1和2的更新操作都是使用聚集索引,当执行到竞争线的时候A持有1的主键索引锁,竞争2的主键索引锁,B持有2的主键索引锁,竞争1的主键索引锁,造成死锁。最后一波解决方案打破死锁的四个必要条件都可以解决死锁问题,调整程序逻辑,使事物A,B的执行逻辑(更新1,2的顺序)一致,避免循环...原创 2018-05-17 20:57:04 · 1351 阅读 · 0 评论 -
MySQL Innodb表导致死锁日志情况分析与归纳
innodb死锁形式归纳死锁产生的四要素:互斥条件:一个资源每次只能被一个进程使用;请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;不剥夺条件:进程 已获得的资源,在末使用完之前,不能强行剥夺;循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。Innodb检测死锁有两种情况,一种是满足循环等待条件,还有另一种策略:锁结构超过mysql配置中设置的最大数量或锁的遍历深...转载 2018-05-18 10:34:58 · 530 阅读 · 0 评论 -
mysql加锁的简单分析
1.在一个支持MVCC并发控制的系统中,哪些读操作是快照读?哪些操作又是当前读呢?以MySQL InnoDB为例: 快照读:简单的select操作,属于快照读,不加锁。(当然,也有例外,下面会分析)select * from table where ?;当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。select * from table where ? lock in shar...转载 2018-05-18 11:08:34 · 218 阅读 · 1 评论