阻塞测试:概念:阻塞的产生往往与事务的并发一起出现,产生的原因与锁有关。当一个事务正在占用某个资源的锁,此时另一个事务正在请求这个资源上与第一个锁相冲突的锁类型时 ,就会
发生阻塞。被阻塞的事务将一直挂起,直到持有锁的事务放弃锁定的资源为止。
建个测试表:
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);
如何避免阻塞(有两种方法):
- 在第一个窗口使用 commit 指令提交:
第二个窗口:
2.在第一个窗口使用 rollback,第二个窗口可正常插入。
更多资讯请上达梦技术社区了解: https://eco.dameng.com