草庐IT

浅谈对死锁的理解

死锁是多线程编程中的一个常见问题,它会导致程序停滞不前,无法继续执行下去。在实际开发中,死锁问题可能会导致程序崩溃,影响系统的稳定性和可靠性。死锁是指两个或多个线程在互相等待对方释放资源的情况下,都无法继续执行下去的现象。死锁通常具有四个特点:互斥、占有并等待、不可剥夺和循环等待。互斥条件:至少有一个资源是排他性的,即一次只能被一个进程使用。占有并等待条件:进程已经占有至少一个资源,并且在等待另一个被其它进程占用的资源。非剥夺条件:进程占有的资源不能被强行剥夺,只能在使用完后自愿释放。循环条件:存在一种进程资源的环形等待链,每个进程都等待下一个进程所占有的资源。举个栗子:相信大家小时候都有看过

浅谈对死锁的理解

死锁是多线程编程中的一个常见问题,它会导致程序停滞不前,无法继续执行下去。在实际开发中,死锁问题可能会导致程序崩溃,影响系统的稳定性和可靠性。死锁是指两个或多个线程在互相等待对方释放资源的情况下,都无法继续执行下去的现象。死锁通常具有四个特点:互斥、占有并等待、不可剥夺和循环等待。互斥条件:至少有一个资源是排他性的,即一次只能被一个进程使用。占有并等待条件:进程已经占有至少一个资源,并且在等待另一个被其它进程占用的资源。非剥夺条件:进程占有的资源不能被强行剥夺,只能在使用完后自愿释放。循环条件:存在一种进程资源的环形等待链,每个进程都等待下一个进程所占有的资源。举个栗子:相信大家小时候都有看过

使用WinDbg调试程序异常和死锁等问题

一、在使用WinDbg调试之前,我们先使用VS的调试功能  1、文件->打开->文件->打开Dump文件     2、调试->选项->调试->符号->添加该应用的.pdb所在的文件夹   3、使用仅限托管进行调试    正常情况下会执行到抛出异常的位置,并且显示异常详情。二、WinDbg下载路径:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools 旧版需要单独配置符号路径,某些版本符号路径没办法全部下载下来,有一些遗漏导致功能用不了,推荐去上面的官网下载新版本SRV

使用WinDbg调试程序异常和死锁等问题

一、在使用WinDbg调试之前,我们先使用VS的调试功能  1、文件->打开->文件->打开Dump文件     2、调试->选项->调试->符号->添加该应用的.pdb所在的文件夹   3、使用仅限托管进行调试    正常情况下会执行到抛出异常的位置,并且显示异常详情。二、WinDbg下载路径:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools 旧版需要单独配置符号路径,某些版本符号路径没办法全部下载下来,有一些遗漏导致功能用不了,推荐去上面的官网下载新版本SRV

MySQL 间隙锁导致的死锁场景分析

实际业务场景在我们使用mysql的时候,如果不注意间隙锁容易引起死锁,最近分析一个业务场景就是间隙锁导致的死锁,业务抽象如下:系统有一个批量新增业务资源的功能,实现逻辑如下(businnessid为非唯一索引):update业务表setisdeleted=1wherebussinessid=123;insertinto业务表在并发场景下,以上逻辑产生了死锁。以下为死锁具体分析以及还原死锁产生过程,最后给出解决方案。创建一张表CREATETABLE`lock_demo`(`id`INTNOTNULLAUTO_INCREMENT,`index`INTNOTNULL,`name`VARCHAR(50

MySQL 间隙锁导致的死锁场景分析

实际业务场景在我们使用mysql的时候,如果不注意间隙锁容易引起死锁,最近分析一个业务场景就是间隙锁导致的死锁,业务抽象如下:系统有一个批量新增业务资源的功能,实现逻辑如下(businnessid为非唯一索引):update业务表setisdeleted=1wherebussinessid=123;insertinto业务表在并发场景下,以上逻辑产生了死锁。以下为死锁具体分析以及还原死锁产生过程,最后给出解决方案。创建一张表CREATETABLE`lock_demo`(`id`INTNOTNULLAUTO_INCREMENT,`index`INTNOTNULL,`name`VARCHAR(50

Mysql和Oracle数据库死锁查看以及解决

一、Mysql数据库死锁排查1.1锁事务查询1.1.1 查看正在锁的事务SQL:SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCKS;1.1.2查看等待锁的事务SQL:SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCK_WAITS;1.1.3查询正在执行的事务SQL:SELECT*FROMinformation_schema.INNODB_TRX;示例:备注:通过查看事务的trx_started(开始时间)来判断该事务的阻塞时间。1.2 死锁解决SQL : kill  线程ID备注:线程ID指的是1.1.3步骤中查询出来的trx_

Mysql和Oracle数据库死锁查看以及解决

一、Mysql数据库死锁排查1.1锁事务查询1.1.1 查看正在锁的事务SQL:SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCKS;1.1.2查看等待锁的事务SQL:SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCK_WAITS;1.1.3查询正在执行的事务SQL:SELECT*FROMinformation_schema.INNODB_TRX;示例:备注:通过查看事务的trx_started(开始时间)来判断该事务的阻塞时间。1.2 死锁解决SQL : kill  线程ID备注:线程ID指的是1.1.3步骤中查询出来的trx_

记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理

昨晚我正在床上睡得着着的,突然来了一条短信。啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志。能清楚看到是这条insert语句发生了死锁。MySQL如果检测到两个事务发生了死锁,会回滚其中一个事务,让另一个事务执行成功。很明显,我们这条insert语句被回滚了。insertintouser(id,name,age)values(6,'张三',6);但是我们怎么排查这个问题呢?到底跟哪条SQL产生了死锁?好在MySQL记录了最近一次的死锁日志,可以用命令行工具查看:showengineinnodbstatus;在死锁日志中,可以清楚地看到这两条insert语句产生了死锁,最终事务2被会

记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理

昨晚我正在床上睡得着着的,突然来了一条短信。啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志。能清楚看到是这条insert语句发生了死锁。MySQL如果检测到两个事务发生了死锁,会回滚其中一个事务,让另一个事务执行成功。很明显,我们这条insert语句被回滚了。insertintouser(id,name,age)values(6,'张三',6);但是我们怎么排查这个问题呢?到底跟哪条SQL产生了死锁?好在MySQL记录了最近一次的死锁日志,可以用命令行工具查看:showengineinnodbstatus;在死锁日志中,可以清楚地看到这两条insert语句产生了死锁,最终事务2被会