达梦dm.ini参数之SELECT_LOCK_MODE详解
2023-12-27 19:28:15
一、背景
1.现象概述
????????某项目当晚分区表变更,因为manager工具多开了1个窗口执行了语句慢取消了,新开了一个会话窗口执行添加分区/删除分区/truncate分区卡死了,v$session查不到关于这张分区表的阻塞和事务,但是在v$lock里根据表的ID查询IX锁和IS锁,为此导致执行语句卡顿。
数据库版本:
V8 3.26 Package 2
--03134284058-20230713-195546-20046 Pack2,
2.管理员手册SELECT_LOCK_MODE解释
二、测试论证
1、建立测试表
create table jlli001(
id NUMBER(10,0),
info1 varchar(2000),
info2 varchar(2000)
)
partition by list(id)
(
partition p1 values(1),
partition p2 values (2),
partition p3 values (3),
partition p4 values (4),
partition p5 values (5)
) ;
insert into jlli001
select mod(rownum,5)+1 id,dbms_random.string('p',2000) name,dbms_random.string('p',2000) n2 from dual connect by rownum<5000000;
2、测试场景
场景1:
create table JLLI003
as
select * from jlli001
where id=4 and info1 like '%a%' ;
同时执行:
alter table jlli001 truncate partition ?p2;
truncate分区会被阻塞,只能等create table 执行完才会执行truncate 分区。
场景2:
insert into JLLI003
select * from jlli001
where id=4 and info1 like '%a%' ; ?
同时执行:
alter table jlli001 truncate partition ?p2;
truncate分区正常执行,不会被阻塞。
三、问题分析及解决方案
1、问题分析
? ? ? ? ①查询建表,DDL语句是在DDL转换的DML语句中对被查询表进行封锁,而非在操作符中上锁,导致SELECT_LOCK_MODE=1无法生效,从而TRUNCATE无法并发。
? ? ? ? ②manager开多个窗口执行语句取消后默认当作一个未结束的事务,不手动点击管理工具事务结束使得窗口执行栏变灰色或关闭次窗口(个人理解是后台其实是认为是一个“事务回滚”)被认为有事务未结束,新session再执行回产生IX锁,查询会产生IS锁,阻塞卡顿。
2、解决方案
1、执行sp_set_para_value(1,'SELECT_LOCK_MODE',1);? ? --动态参数不需要重启后IX锁消失。
2、把管理工具manager开启的全部窗口关闭(个人理解是后台其实是认为是一个“事务回滚”),只打开一个会话窗口执行变更语句就可以成功。
关键参数:
SELECT_LOCK_MODE=1
TRUNC_CHECK_MODE=1 ?#ADD BY LJL 1206,这2个参数组合起来,并发truncate分区子表不会打断对其他分区的查询。
更多文章请关注?羽书飞影_达梦数据库-CSDN博客
文章来源:https://blog.csdn.net/weixin_42018955/article/details/135239324
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!