死锁分析延续

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 可知上一篇【死锁分析】,又重新表达了一些图片,图画更了

可知上一篇【死锁分析】,又重新表达了一些图片,图画更了

【使用电脑阅读更佳】

image.png

事务1 事务2
- 开始
开始 删除id=1;(1)id加锁、(2)A加锁
删除id=2;(3)id加锁、(4)A加锁 -
  • | 更新 ?用户ID=?和租户ID=?没有=?;
  • | 如果先走无索引,已经持有B锁,再去持D锁时等待更新?用户ID=?和租户ID=?没有=?;| - 先走无索引,持B锁时等待;死锁 |-

更新 ?用户ID=?和租户ID=?and no=?如果先走(tenantid ,user id);这个日志一

先走不,日志二

索引,常用日志三


最近的事情,习了部分数据库的理论知识,后面又有温时间再整理。现在的程序员也真得难得知天文,下地理;这应该是DBA的,作为开发者的长,作为开发者深研,真难

在追查死锁的过程中,对照组的理论有一些做法,总结一下:

查看自动提交事务选项

show session variables like 'autocommit';
show global variables like 'autocommit’;
set session autocommit=0;
set global autocommit=0;

查看事务隔离等级

select @@tx_isolation

查看锁信息,想查看一条sql使用锁,需要打开锁监听

show session variables like '%output%';
#开启InnoDB锁监控
set global innodb_status_output_locks=on;
set global innodb_status_output=on;
#上面的语句可定期写入到标准错误输出(stderr,即error log,大概每15s写一次),你也可以使用 SHOW ENGINE INNODB STATUS 语句直接在客户端获取innodb信息
show session variables like '%output%';

要启用 InnoDB 锁定的 SHOW ENGINE INNODB STATUS 输出,立即启用 innodb状态output_locks

打开监控开关后,在mysql日志文件中会出现

=====================================
2020-06-30 15:44:46 7fdc8a76e700 INNODB MONITOR OUTPUT
=====================================
----------------------------
END OF INNODB MONITOR OUTPUT
============================

打开监控,可以确定一下常用锁的语句信息

执行完一条SQL,使用SHOW ENGINE INNODB STATUS打印出锁信息

delete from invoice_collection_info where id=1275244823997059072
TABLE LOCK table `assist`.`invoice_collection_info` trx id 1636893 lock mode IX
RECORD LOCKS space id 18491 page no 211 n bits 104 index `PRIMARY` of table `assist`.`invoice_collection_info` trx id 1636893 lock_mode X locks rec but not gap

删除语句,根据主键操作;可以显示删除表锁IX模型,还有一个主键索引锁

就是如果有一段索引,所以会有第二次索引锁,但那是显示隐式的,后面没有显示锁式,后面会有试验让隐式锁化


使用第一索引删除操作

delete FROM invoice_item WHERE ( collection_id = 1275244823997059072 );
TABLE LOCK table `assist`.`invoice_item` trx id 1636964 lock mode IX
RECORD LOCKS space id 18493 page no 4 n bits 784 index `idx_collection_id` of table `assist`.`invoice_item` trx id 1636964 lock_mode X locks rec but not gap
Record lock, heap no 563 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 8; hex 91b2946930001000; asc    i0   ;;
 1: len 8; hex 91b2ae5d61401000; asc    ]a@  ;;
RECORD LOCKS space id 18493 page no 12 n bits 96 index `PRIMARY` of table `assist`.`invoice_item` trx id 1636964 lock_mode X locks rec but not gap
Record lock, heap no 28 PHYSICAL RECORD: n_fields 23; compact format; info bits 0

先在第一索引上加锁,再在的主键索引上加锁


使用第一索引查询

select * from invoice_collection_info where invoice_uiq_flag = '031001900104-62079412' for update
TABLE LOCK table `assist`.`invoice_collection_info` trx id 1636947 lock mode IX
RECORD LOCKS space id 18491 page no 642 n bits 344 index `idx_uniflag` of table `assist`.`invoice_collection_info` trx id 1636947 lock_mode X locks rec but not gap
RECORD LOCKS space id 18491 page no 496 n bits 96 index `PRIMARY` of table `assist`.`invoice_collection_info` trx id 1636947 lock_mode X locks rec but not gap

从日志中,先在invoice_uiq_flg索引上加锁,再在主键加锁


使用主键更新操作

update invoice_collection_info set invoice_uiq_flag = '031200190010-62079412' WHERE (  id = 1275244823997059072 );
TABLE LOCK table `assist`.`invoice_collection_info` trx id 1636958 lock mode IX
RECORD LOCKS space id 18491 page no 741 n bits 88 index `PRIMARY` of table `assist`.`invoice_collection_info` trx id 1636958 lock_mode X locks rec but not gap

这会在但主键加X,同时在同一索引上显示也加X,有一次没有出来;这里跟删除,其实也是个式锁


模拟测试,操作主键,更新索引列表删除,另一条使用记录类似死锁,把更新中的一段代码显示出来了

image.png


在RC等级下进行的操作,对于选择操作,读取结果都不会加锁,也不会加理论与理论

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
关于死锁的原因及解决方案
关于死锁的原因及解决方案
168 0
|
1天前
|
监控 安全 定位技术
《C++新特性:为多线程数据竞争检测与预防保驾护航》
多线程编程是提升软件性能的关键,但数据竞争问题却是一大挑战。C++新特性如增强的原子类型和完善的内存模型,为检测和预防数据竞争提供了有力支持。这些改进不仅提高了程序的可靠性,还提升了开发效率,使多线程编程更加安全高效。
41 19
|
SQL Oracle 关系型数据库
案例分析:你造吗?有个ORA-60死锁的解决方案
这段时间应用一直被一个诡异的 ORA-00060 的错误所困扰,众所周知,造成 ORA-00060 的原因是由于应用逻辑,而非 Oracle 数据库自己,之所以说诡异(“诡异”可能不准确,只能说这种场景,以前碰见的少,并未刻意关注),是因为这次不是常见的,由于读取数据顺序有交叉,导致ORA-0006.
2488 0
|
3月前
|
监控 算法 安全
Java并发编程案例分析:死锁的检测与解决
Java并发编程案例分析:死锁的检测与解决
37 2
|
4月前
|
算法 调度 人工智能
人工智能线程问题之无锁化编程如何解决
人工智能线程问题之无锁化编程如何解决
48 2
|
5月前
|
Java
探秘死锁:原理、发生条件及解决方案
探秘死锁:原理、发生条件及解决方案
118 1
|
6月前
|
算法 Java
Java多线程基础-13:一文阐明死锁的成因及解决方案
死锁是指多个线程相互等待对方释放资源而造成的一种僵局,导致程序无法正常结束。发生死锁需满足四个条件:互斥、请求与保持、不可抢占和循环等待。避免死锁的方法包括设定加锁顺序、使用银行家算法、设置超时机制、检测与恢复死锁以及减少共享资源。面试中可能会问及死锁的概念、避免策略以及实际经验。
99 1
|
6月前
|
监控 算法 安全
Java并发编程案例分析:死锁的检测与解决
【4月更文挑战第6天】Java并发编程中的死锁导致线程僵持,资源无法释放,影响程序性能。死锁涉及互斥、请求与保持、不剥夺和循环等待四个条件。案例分析展示了银行转账场景下的死锁可能。检测死锁可通过日志、代码审查和使用工具。解决策略包括避免死锁(如设定锁顺序、超时机制)和处理死锁(如终止线程、资源抢占)。理解死锁原理并采取预防措施对构建稳定、高效的多线程应用至关重要。
127 1
|
6月前
|
监控 安全
线程死循环是多线程应用程序开发过程中一个难以忽视的问题,它源于线程在执行过程中因逻辑错误或不可预见的竞争状态而陷入永久运行的状态,严重影响系统的稳定性和资源利用率。那么,如何精准定位并妥善处理线程死循环现象,并在编码阶段就规避潜在风险呢?谈谈你的看法~
避免线程死循环的关键策略包括使用同步机制(如锁和信号量)、减少共享可变状态、设置超时、利用监控工具、定期代码审查和测试、异常处理及设计简洁线程逻辑。通过这些方法,可降低竞态条件、死锁风险,提升程序稳定性和可靠性。
100 0