线上死锁问题排查和处理

Java 死锁排查

通过 jps +  jstack 来定位和排查

如果线程长时间处于阻塞,就需要考虑是否是死锁了。

模拟死锁

public class DeadlockDemo {private static final Object lock1 = new Object();private static final Object lock2 = new Object();public static void main(String[] args) {// 创建线程1Thread t1 = new Thread(() -> {synchronized (lock1) {System.out.println("Thread 1: Holding lock 1...");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread 1: Waiting for lock 2...");synchronized (lock2) {System.out.println("Thread 1: Holding lock 1 & 2...");}}});// 创建线程2Thread t2 = new Thread(() -> {synchronized (lock2) {System.out.println("Thread 2: Holding lock 2...");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread 2: Waiting for lock 1...");synchronized (lock1) {System.out.println("Thread 2: Holding lock 1 & 2...");}}});// 启动线程t1.start();
//        try {
//            Thread.sleep(1000);
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }t2.start();}
}

Thread 1: Holding lock 1...
Thread 2: Holding lock 2...
Thread 1: Waiting for lock 2...
Thread 2: Waiting for lock 1...

通过 jps +  jstack 来定位和排查

PS D:\xxx> jps   查看java进程状态
19504
16356 RemoteMavenServer36
20692 Launcher
9044 DeadlockDemo
13064 Jps

PS D:\xxx> jstack 9044   打印java进程堆栈


Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x0000000026a08df8 (object 0x00000007174cc1b8, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x0000000026a0b898 (object 0x00000007174cc1c8, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at DeadlockDemo.lambda$main$1(DeadlockDemo.java:33)
        - waiting to lock <0x00000007174cc1b8> (a java.lang.Object)
        - locked <0x00000007174cc1c8> (a java.lang.Object)
        at DeadlockDemo$$Lambda$2/1078694789.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)
"Thread-0":
        at DeadlockDemo.lambda$main$0(DeadlockDemo.java:17)
        - waiting to lock <0x00000007174cc1c8> (a java.lang.Object)
        - locked <0x00000007174cc1b8> (a java.lang.Object)
        at DeadlockDemo$$Lambda$1/1324119927.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

预防和处理死锁

1.考虑顺序获取需要的资源;

2.考虑无锁的方案;

MySQL死锁排查

使用 SHOW ENGINE INNODB STATUS    # 查看 死锁日志

模拟死锁

建表语句


-- 创建users表
CREATE TABLE users (id INT PRIMARY KEY,          -- 主键,唯一标识用户name VARCHAR(50) NOT NULL,   -- 用户名称balance DECIMAL(10, 2)       -- 用户余额
);-- 为name字段创建普通索引
CREATE INDEX idx_name ON users (name);-- 插入测试数据
INSERT INTO users (id, name, balance) VALUES
(1, 'Bob', 1000.00),       -- 用户Bob,余额1000
(2, 'Alice', 1000.00);     -- 用户Alice,余额1000UPDATE `users`
set balance = 1000;

事务1

-- 会话1
BEGIN;
UPDATE users SET balance = balance - 100 WHERE name = 'Bob';  -- 更新Bob的余额
UPDATE users SET balance = balance + 100 WHERE name = 'Alice';  -- 更新COMMIT;

事务2

-- 会话2
BEGIN;
UPDATE users SET balance = balance + 100 WHERE name = 'Alice';  -- 更新Alice的余额
UPDATE users SET balance = balance - 100 WHERE name = 'Bob';  -- 更新Bob的余额COMMIT;

死锁检测设置


show variables like 'innodb_deadlock_detect';set global innodb_deadlock_detect = 1;  # 开启死锁检测   如有死锁 会回滚某一个事务
set global innodb_deadlock_detect = 0;SHOW ENGINE INNODB STATUS    # 查看 死锁日志

首先关闭死锁检测

执行事务1 的前2条语句, 执行事务2,  会发现事务2 阻塞住了

 SHOW ENGINE INNODB STATUS    # 查看 死锁日志

开启死锁检测

 预防和处理MySQL死锁

1. 统一资源访问顺序;

2.减少事务执行时间,长事务的死锁概率更高;

3.选择合适的隔离级别,如果不需要保证可重复读,可以选择读取已提交;

可重复读可能会产生 间隙锁,增大死锁的概率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22571.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问&#xff1a;怎么本地部署 DeepSeek 搭建个人知识库。 老实说&#xff0c;如果你不是为了研究技术&#xff0c;或者确实需要保护涉密数据&#xff0c;我真不建议去折腾本地部署。 为什么呢&#xff1f; 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…

MT7628基于原厂的SDK包, 修改ra1网卡的MAC方法。

1、在/etc/config/wireless文件添加多个WIFI网卡的方法。 2、修改WIFI驱动&#xff0c;在src/embedded/ap/ap.c文件里面&#xff0c;从系统文件信息来修改ra1网卡的MAC内容&#xff0c;添加红色部分源代码。 RTMP_IO_WRITE32(pAd, RMAC_RMACDR, Value); if (idx > 0) …

brew Nushell mac升级版本

运行命令&#xff1a; brew upgrade nushell 国内更新比较慢建议架个梯子。 如果没有更新则先更新一下brew brew update 更新后看下版本是否死最新的了

windows怎样查看系统信息(处理器等)

首先打开命令行工具 win R 输入 cmd&#xff0c; 输入 msinfo32 &#xff0c;然后回车 这个页面就可以看到 电脑的锐龙版就是 AMD 芯片 酷睿版就是 intel 芯片

mysql之Innodb数据页

Innodb数据页结构 InnoDB数据页结构一、数据页基础概念二、数据页核心结构1. 头部控制区2. 数据存储区3. 尾部与目录区 三、关键机制详解1. 记录链表与删除优化2. 页目录与二分查找3. 空间复用与碎片管理4. 数据页的合并与分裂 四、应用与性能影响1. 索引效率2. 插入优化3. 事务…

1200沿指令和取反指令的应用。

以下是关于西门子S7-1200 PLC中沿指令&#xff08;边沿检测指令&#xff09;和取反指令的详细解析及应用示例&#xff0c;结合其工作原理、编程方法和典型场景&#xff1a; 一、沿指令&#xff08;边沿检测指令&#xff09; 1. 功能说明 沿指令用于检测信号状态的变化&#x…

three.js之特殊材质效果

*案例42 创建一个透明的立方体 <template><div ref"container" className"container"></div> </template><script setup> import * as THREE from three; import WebGL from three/examples/jsm/capabilities/WebGL.js // 引…

三格电子上新了——PLC 数据采集网关

型号&#xff1a;SG-PLC-Private 第一章 产品概述 PLC 转 Modbus 网关型号 SG-PLC-Private &#xff08; PLC 私有协议网关&#xff09;&#xff0c;是三格电子推出的工业 级网关&#xff08;以下简称网关&#xff09;&#xff0c;主要用于 在不需要对 PLC 编程的情况…

算法日记25:01背包(DFS->记忆化搜索->倒叙DP->顺序DP->空间优化)

对于01背包这类DP入门的问题&#xff0c;新手应该是去了解如何一步步得出所谓的状态转移方程&#xff0c;而不是直接去看答案所给予的方程过程应该为&#xff1a;DFS->记忆化搜索->倒序递推->循序递推->二维->一维 一、DFS暴力搜索 O ( 2 n ) O(2^n) O(2n) 1…

Spring AutoWired与Resource区别?

大家好&#xff0c;我是锋哥。今天分享关于【Spring AutoWired与Resource区别?】面试题。希望对大家有帮助&#xff1b; Spring AutoWired与Resource区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Spring 中&#xff0c;Autowired 和 Resource 都是用于…

【知识】深度学习中,应该先zero_grad还是先backward?

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 抛出问题 各大GPT的回答 ChatGPT-4o ChatGPT-o3-mini-high Kimi-长思考 Deepseek-R1 Grok3 Pytorch官方教程中 抛出问题 以下哪种方式是…

Python----数据结构(哈希表:哈希表组成,哈希冲突)

一、哈希表 哈希表(Hash table)是一种常用、重要、高效的数据结构。 哈希表通过哈希函数,可以快速地将键(Key)映射到值(Value)。从而允许在近常数时间内对键关联的值进行插入、删除和查找操作。 哈希表的主要思想是通过哈希函数将键转换为索引&#xff0c;将索引映射到数组中…

使用excel中的VBA合并多个excel文件

需求是这样的&#xff1a; 在Windows下&#xff0c;用excel文件让多个小组填写了统计信息&#xff0c;现在我需要把收集的多个文件汇总到一个文件中&#xff0c;前三行为标题可以忽略&#xff0c;第四行为收集信息的列名&#xff0c;处理每一行数据的时候&#xff0c;发现某一行…

功能全面的手机壁纸应用,种类齐全、众多高清壁纸

软件介绍 应用亮点&#xff1a;今天给大家分享一款超神奇的手机应用 —— 奇幻壁纸。它作为手机动态壁纸软件&#xff0c;功能超全面&#xff0c;操作还便捷&#xff0c;极具创意&#xff0c;能瞬间将你的手机屏幕变成奇幻世界&#xff0c;带来全新视觉感受。 使用便捷性&…

docker安装kafka,并通过springboot快速集成kafka

目录 一、docker安装和配置Kafka 1.拉取 Zookeeper 的 Docker 镜像 2.运行 Zookeeper 容器 3.拉取 Kafka 的 Docker 镜像 4.运行 Kafka 容器 5.下载 Kafdrop 6.运行 Kafdrop 7.如果docker pull wurstmeister/zookeeper或docker pull wurstmeister/kafka下载很慢&#x…

前端导出word文件,并包含导出Echarts图表等

基础导出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …

2024系统编程语言风云变幻:Rust持续领跑,Zig与Ada异军突起

2024年系统编程语言调查报告新鲜出炉&#xff01;这份报告对Rust、Zig、Ada、C、C等主流语言进行了全面评估&#xff0c;结果令人瞩目。Rust凭借其强大的类型系统和内存安全机制继续领跑&#xff0c;而Zig和Ada则展现出巨大的潜力&#xff0c;为系统编程领域带来了新的活力。本…

Jenkins 构建 Unity 打包 .apk 同时生成 .aab

Jenkins 构建 Unity 打包 .apk 同时生成 .aab Android App Bundle简称 AAB&#xff0c;想了解更多关于 AAB 的知识&#xff0c;请看官网 https://developer.android.google.cn/guide/app-bundle/faq?hlzh-cn APK 打包部分在复用上一篇 Jenkins 构建 Unity打包APK 一、新建一…

JAVAweb-标签选择器,盒模型,定位,浮动

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>标签</title><style type"text/css&q…

计算机视觉:主流数据集整理

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…