什么是阻塞

由于不同锁之间的兼容关系,造成一个事务需要等待另一个事务释放其所占用的资源的现象 称为 阻塞

如何发现阻塞

mysql_8.0

SELECT waiting_pid as '被阻塞的线程',
waiting_query as '被阻塞的SQL',
blocking_pid as '阻塞线程',
blocking_query as '阻塞SQL',
waiting_age as '阻塞时间',
sql_kill_blocking_query as '建议操作'
FROM
sys.innodb_lock_waits
WHERE
( UNIX_TIMESTAMP() - UNIX_TIMESTAMPP(wait_started) ) > 30;

这里的 30 是三十秒的意思

如何处理阻塞

  1. 终止占用资源的事务(治标不治本)
  2. 优化占用资源事务的SQL,使其尽快释放资源

什么是死锁

并行执行的多个事务相互之间占有了对方所需要的资源

比如:

事务一
BEGIN;
Update course set score = 9.7 where course_id = 35;
update user set score = score - 10 where user_id = 10;
事务二
BEGIN;
update user set score = score + 10 where user_id = 10;
Update course set score = 9.8 where course_id = 35;

由于事务一和事务二 where条件一致,在一定的条件下会导致死锁,比如事务一在执行第一条sql时对该资源加排他锁,同时事务二对另一资源加上了排他锁,当两个事务在执行它们的第二条SQL时,会分别等待对方的排他锁释放,导致死锁发生

如何发现死锁

将死锁记录到错误日志中
set global innodb_print_all_deadlocks = on;
死锁日志例子(整理后):
TRANSACTION 1704, ACTIVE 119 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 4 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MYSQL thread id 12, OS thread handle 14025222817xxxxx, query id 170 localhost root update
update imc_user set score = score + 10 where user_id = 10

这里记录的可能不是导致产生死锁的那个SQL, 而是事务中发生死锁时正在执行的那个SQL,所以还是根据这个线索去程序中寻找问题的症结所在

如何处理事务的死锁

1. mysql 在发生死锁时会自行回滚占用资源少的事务(但这样就影响到了业务,治标不治本)

2. 将发现的造成死锁的事务代码按相同的顺序去占用资源,资源可以将死锁降为阻塞

mysql_阻塞和死锁的更多相关文章

  1. 专门查看阻塞和死锁情况以及引起的SQL语句,你可以创建后,直接运行之。

    CREATE procedure sp_who_lock as begin declare @spid int declare @blk int declare @count int declare ...

  2. 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

    原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...

  3. sqlserver 数据库阻塞和死锁

    参考原文:http://blog.csdn.net/ha196200/article/details/44985597 (1) 数据库阻塞: 假设第一个连接T1占有且没有释放资源,第二个连接T2请求同 ...

  4. SQL Server数据库阻塞,死锁查询

    sql 查询卡顿数据库 SELECT SPID=p.spid, DBName = convert(CHAR(20),d.name), ProgramName = program_name, Login ...

  5. SQL SERVER读书笔记:阻塞与死锁

    阻塞是事务隔离带来的副作用,而并不是SQL SERVER的错. 死锁则是互相争用资源而引发.由于死锁会选择牺牲者,所以死锁的危害没有阻塞大.但有时为了解决死锁,会采取对资源加锁,导致阻塞的方式来避免.

  6. sql server 2000数据库 最近经常出现某进程一直占用资源,阻塞?死锁?

    OA的数据库最近多次出现某进程一直占用资源,导致其他进程无法执行.使用sp_who2 和 sql server profiler跟踪查询,发现有以下几个语句常常占用资源: 1.declare @P1 ...

  7. jstack简单使用,定位死循环、线程阻塞、死锁等问题

    当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位: 废话不说,直接上例子吧,在window平台上的: 死循环 写个死循环的程序如下: pac ...

  8. sqlserver监控阻塞(死锁)具体情况

    公司sqlserver的监控系统主要是采用zabbix监控,但是zabbix的监控只能通过性能计数器给出报警,而无法给出具体的阻塞情况,比如阻塞会话.语句.时间等,所以需要配合sqlserver的一些 ...

  9. sqlserver监控阻塞(死锁)具体情况(转)

    公司sqlserver的监控系统主要是采用zabbix监控,但是zabbix的监控只能通过性能计数器给出报警,而无法给出具体的阻塞情况,比如阻塞会话.语句.时间等,所以需要配合sqlserver的一些 ...

随机推荐

  1. SAP HTLM Control

    HTML 事件 效果 代码 *&---------------------------------------------------------------------* *& Re ...

  2. SAP Table control

    REPORT RSDEMO02. * demostrates the use of table controls * unsolved problems: attributes left_col an ...

  3. 嵌入式中 动态阿拉伯语字符串 转换 LCD显示字符串【感谢建国雄心】

    本文参考CSDBN:建国雄心 的博客,这里找不到该帖子,放一个类似的仅供参考https://blog.csdn.net/qiaojiongzeng6321/article/details/748572 ...

  4. 【Python基础教程】三种常用、效率最高的Python字符串拼接方法

    python字符串连接的方法,一般有以下三种: **方法1:**直接通过加号(+)操作符连接website=& 39;python& 39;+& 39;tab& 39; ...

  5. JDBC:处理事务

    1.如何实现事务 如果现在希望对 A 表和 B 表同时删除某一个 id 号的记录,使这两个sql操作组成一个事务.(成功则同时成功,否则都失败) 注意:如果 B 表 建立了引用 A 表的id外键,并指 ...

  6. NFS介绍与搭建

    一.NFS的介绍 1.1.什么是NFS NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布. NFS在文件传 ...

  7. zookeeper和spring cloud版本冲突

    1.使用elastic-job进行任务调度,而核心的就是使用zookeeper进行管理,但这个与spring cloud 冲突造成启动不了 |ERROR |main |SpringApplicatio ...

  8. Java学习_常见异常

    JAVA常见异常 Java.io.NullPointerException null 空的,不存在的 NullPointer 空指针 空指针异常,该异常出现在我们操作某个对象的属性或方法时,如果该对象 ...

  9. 简单使用 MySQL 索引

    MySQL 索引 1 什么是索引 在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL 的查询和 运行更加高效. 如果合理的设计且使用索引的 MySQL 是一辆兰博基 ...

  10. 聊聊 C++ 右值引用 和 移动构造函数

    一: 背景 最近在看 C++ 的右值引用和移动构造函数,感觉这东西一时半会还挺难理解的,可能是没踩过这方面的坑,所以没有那么大的深有体会,不管怎么说,这一篇我试着聊一下. 二: 右值引用 1. 它到底 ...