| 导语 数据库在执行过程中经常会遇到有SQL执行时间超长,互相阻塞的问题。如何快速找出罪魁祸首,并且干掉此类语句让流程继续,本文将简单为大家讲明。 当我们遇到语句简单但是执行时间超长的SQL语句时,不一定是因为SQL写得不好,很大可能是因为遇到了数据库的等待事件了,如何判断语句是因为什么原因而阻塞的呢?
我们使用一个测试场景进行模拟演习一次,首先创建一个表,然后插入部分数据,再显示的创建事务,构造一个锁等待的场景。
create table t1(id int primary key);
insert into t1 select generate_series(1,10000);
begin;delete from t1;
# 再另开一个session 执行同样的语句:
begin;delete from t1;
此时就可以发现在执行第二个事务的时候,SQL明显无法执行下去,因为第一个事务未提交。
当然我们可以通过一些现成的语句来直接查看锁信息,如:
SELECT blocking_activity.datname as "数据库", blocking_activity.application_name as "持锁会话程序名", blocking_activity.client_addr as "持锁会话地址", now()-blocking_activity.query_start as "阻塞时长(s)", blocked_locks.pid AS "阻塞会话ID", blocked_activity.usename AS "被阻塞用户", blocking_locks.pid AS "持锁会话ID", blocking_activity.use