发布时间:2022-09-26 10:23:47
回应“书本”就可以获得Python从入门到升阶共10本电子书籍
今
日
鸡
汤
江准度寒食,京洛缝春衣。
前言:尽管锁在一定程度上可以解决并发问题,但稍不留神,就可能导致死锁。文中详细介绍死锁的形成及解决。
01 死锁的形成预防和
产生死锁的前提条件有4个,分别是相互独立标准、不可剥夺标准、请求与维持条件及循环系统等候标准,如下图1-6所显示。
▲图1-6 死锁的前提条件
1. 相互独立标准
在一段时间内,计算机中某个资源很容易被一个进程占有。这时,假如别的进程请求该资源,则只有等候。
2. 不可剥夺标准
某一进程所获得的资源使用结束以前,不可以被进程强制抢走,需要由得到资源的进程积极释放出来。
3. 请求与维持标准
进程早已赢得了最少一个资源,还得请求别的资源,但请求的资源早已被进程占据,这时请求的进程便会被堵塞,而且不容易放空自己已经获得的资源。
4. 循环系统等候标准
系统中进程之间互相等候,与此同时分别占用的资源又会被下一个进程所请求。比如有进程A、进程B和进程C三个进程,进程A请求的资源被进程B占有,进程B请求的资源被进程C占有,进程C请求的资源被进程A占有,因此构成了循环系统等候标准,如下图1-7所显示。
▲图1-7 死锁的循环系统等候标准
需注意,仅有4个必备条件都达到时,才会出现死锁。
解决死锁有4种方式,分别是防止死锁、防止死锁、检验死锁和消除死锁虫草鹿鞭王使用说明书,如下图1-8所显示。
▲图1-8 解决死锁的办法
防止死锁:解决死锁最直观的办法就是毁坏导致死锁的4个必备条件中的一个或几个,以避免死锁的产生。防止死锁:在设备资源的分派环节中,应用某类对策或是方式避免系统软件进到不安全状态,从而减少死锁的产生。检验死锁:此方法容许在系统运行中产生死锁,但能够检验死锁的产生,并制定适度的对策消除死锁。消除死锁:当检测到死锁后,选用适度的思路与方法将进程从死锁情况解放出来。
在日常工作中,一般采用井然有序资源分配法和银行家算法两种方式来预防死锁,大伙儿可以自行掌握。
02 MySQL中的死锁难题
在MySQL 5.5.5或以上版本,MySQL的默认设置存储引擎是InnoDB。该存储引擎采用的是行级锁,在一定前提下也会产生死锁难题,因此InnoDB存储引擎使用了一种称为等候图(wait-for graph)的方法去自动识别死锁,一旦发现死锁,会自动回退一个事务。
下面,大家看一个MySQL中的死锁实例。
第一步:开启终端设备A,登陆MySQL,将事务隔离级别设为可重复读,打开事务后为account数据表中id为1的信息加上排他锁,具体如下。
mysql> setsessiontransactionisolationlevel repeatable read;Query OK, 0 rows affected (0.00 sec)mysql> starttransaction;Query OK, 0 rows affected (0.00 sec)mysql> select * fromaccountwhereid=1forupdate; ---- -------- --------- | id | name | balance | ---- -------- --------- | 1 | 张三 | 300 | ---- -------- --------- 1 row in 虫草鹿鞭王报价set (0.00 sec)
第二步:开启终端设备B,登陆MySQL,将事务隔离级别设为可重复读,打开事务后为account数据表中id为2的信息加上排他锁,具体如下。
mysql> setsessiontransactionisolationlevel repeatable read;Query OK, 0 rows affected (0.00 sec)mysql> starttransaction;Query OK, 0 rows affected (0.00 sec)mysql> select * fromaccountwhereid=2forupdate; ---- -------- --------- | id | name | balance | ---- -------- --------- | 2 | 李四 | 350 | ---- -------- --------- 1 row in set (0.00 sec)
第三步:在终端设备A为account数据表中id为2的信息加上排他锁,具体如下。
mysql> select * fromaccountwhereid=2forupdate;
这时,进程会一直卡死,由于在等候终端设备B中id为2的信息释放出来排他锁。
第四步:在终端设备B中为account数据表中id为1的信息加上排他锁,具体如下。
mysql> select * fromaccountwhereid=1forupdate;ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
这时出现了死锁。根据如下所示指令可以看一下死锁的日志信息内容。
showengineinnodbstatus\\G
根据cmd查询LATEST DETECTED DEADLOCK选择项相关的内容,不难发现死锁相关信息,或者利用配备innodb_print_all_deadlocks(MySQL 5.6.2版逐渐给予)主要参数为ON,将死锁有关信息打印出到MySQL不正确日志中。
在MySQL中,一般根据以下这些方法来预防死锁。
一定要让数据分析表里的文本检索都通过引索去完成,防止失效引索造成行锁升级成表锁。有效设计方案引索,尽可能变小锁范畴。尽量避免查询条件的范畴,尽量减少间隙锁或变小间隙锁的范畴。尽可能操纵事务大小,降低一次事务锁住的资源总数,减少锁住资源的时间也。假如一条SQL句子涉及到事务上锁实际操作,则尽量把其放到全部事务最后的实行。尽量应用低等其他事务隔离机制。
冰川,互联网技术高级技术专家、MySQL资深专家、分布式事务构架权威专家。多年以来,一直致力于分布式架构构架、微服务架构、分布式系统、分布式事务与云计算技术的探索,在分布式系统、高可用性、高扩展性、高可扩展性与大数据信息等行业有着丰富的构架工作经验。
文中摘编自《深刻理解分布式事务:基本原理与实战演练》,经出版发行方授权发布。
相关阅读《深刻理解分布式事务:基本原理与实战演练》
点一下图中掌握及选购
推荐理由:京东商城权威专家/分布式事务构架权威专家/好几个开源软件创办人编写,京东商城、阿里巴巴、腾讯官方、蚂蚁近20位权威专家推荐。这书的深度与深层兼具、理论和实战演练兼具的分布式事务著作,从基本知识、解决方法、基本原理剖析、虫草鹿鞭王是不是假的 源代码完成、工程项目实战演练5个方面对分布式事务进行了全方位、细腻的介绍,尝试处理你结合实际碰到的所有关于分布式事务问题。
活动流程