达梦数据库SQL阻塞分析及解决办法

发布于:2022-12-10 ⋅ 阅读:(667) ⋅ 点赞:(0)

阻塞测试:概念:阻塞的产生往往与事务的并发一起出现,产生的原因与锁有关。当一个事务正在占用某个资源的锁,此时另一个事务正在请求这个资源上与第一个锁相冲突的锁类型时 ,就会

发生阻塞。被阻塞的事务将一直挂起,直到持有锁的事务放弃锁定的资源为止。

建个测试表:

CREATE TABLE "SYSDBA"."TEST1" 
( 
"NAME" VARCHAR(20), 
"ID" INT NOT NULL, 
NOT CLUSTER PRIMARY KEY("ID"));

打开两个查询窗口:

在两个窗口都输入插入数据语句:

insert into sysdba.test1 values('aaa',1); 

 

一个窗口顺利执行:

 

第二个窗口无反应,发生阻塞:

 

原因分析:第一个窗口里,插入的数据由于没有 commit 提交,事务没有结束,此时因为存在主键约束,第二个窗口查不到对应的数据,同样也无法插入,此时发生阻塞。

解决阻塞办法:

通过 v$trxwait 视图查看进程,找到id,id对应着v$sessions视图的sess_id:

 

4051 即为被堵塞的事务,在通过 v$sessions 视图查看:

 

4051 即为第二个窗口的插入语句。

可调用 SP_CLOSE_SESSION(SESS_ID);系统函数来关闭会话。

SP_CLOSE_SESSION(4051);

如何避免阻塞(有两种方法):

  1. 在第一个窗口使用 commit 指令提交: 

 第二个窗口:

 

2.在第一个窗口使用 rollback,第二个窗口可正常插入。

更多资讯请上达梦技术社区了解: https://eco.dameng.com

 

 


网站公告

今日签到

点亮在社区的每一天
去签到