oracle 9i r2 锁争用:DDL 和 DML 和 LOCK TABLE tablename IN exclusive mode

being21 2010-09-12 02:19:00

--建表
-- Create table
create table ACRM_ERRLOG
(
ERR_INFO VARCHAR2(4000),
ERR_TIME DATE
)
tablespace USER01
;
-- Create/Recreate indexes
create index IDX_ACRM_ERRLOG on ACRM_ERRLOG (ERR_INFO)
tablespace USER01
;
--DML操作块
DECLARE
v_errormsg VARCHAR2(200);
v_count NUMBER;
BEGIN
v_errormsg := 0;
v_count := 5;

LOOP
BEGIN
v_errormsg := 1;
INSERT INTO acrm_errlog
SELECT v_count,to_date('20100903', 'yyyymmdd')
FROM ifsap_bankctl
;
COMMIT;
DBMS_LOCK.SLEEP(1);
v_errormsg := 2;
UPDATE acrm_errlog
SET err_time = to_date('20100903', 'yyyymmdd')
WHERE err_info = v_count;
COMMIT;
DBMS_LOCK.SLEEP(1);
END;
v_count := v_count + 1;
EXIT WHEN v_count = 1000;
if v_count = 10 then
dbms_output.put_line(v_count);
end if;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(v_errormsg);
ROLLBACK;
RAISE;
END;
--DDL操作块

DECLARE
v_errormsg VARCHAR2(200);
v_count NUMBER;
BEGIN
v_errormsg := 0;
v_count := 0;
LOOP
v_errormsg := 10;
LOCK TABLE ACRM_ERRLOG IN exclusive mode ;
--DBMS_LOCK.SLEEP(1);
v_errormsg := 11;
EXECUTE IMMEDIATE 'drop index IDX_ACRM_ERRLOG';
DBMS_LOCK.SLEEP(1);
v_errormsg := 12;
LOCK TABLE ACRM_ERRLOG IN exclusive mode ;
--DBMS_LOCK.SLEEP(1);
v_errormsg := 13;
EXECUTE IMMEDIATE 'create index IDX_ACRM_ERRLOG on ACRM_ERRLOG (err_info)';
DBMS_LOCK.SLEEP(1);
v_errormsg := 1;
LOCK TABLE ACRM_ERRLOG IN EXCLUSIVE MODE;
--DBMS_LOCK.SLEEP(1);
v_errormsg := 2;
EXECUTE IMMEDIATE 'rename ACRM_ERRLOG to ACRM_ERRLOGX';
v_errormsg := 3;
EXECUTE IMMEDIATE 'rename ACRM_ERRLOGX to ACRM_ERRLOG ';
DBMS_LOCK.SLEEP(1);
v_count := v_count + 1;
EXIT WHEN v_count = 1000;
if v_count = 10 then
dbms_output.put_line(v_count);
end if;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(v_errormsg);
ROLLBACK;
RAISE;
END;
/*
问题:两个块同时运行,假设DML块一直都在运行,如果在运行DDL块的时候,保证DDL块能正确操作,不返回错误?
我尝试在DDL操作前加了 LOCK TABLE ACRM_ERRLOG IN exclusive mode ;,但是不起作用。
DDL块还可能会获得错误,而中断程序。
测试发现如果不加延时,两个块无论谁先执行,另外一个块就无法执行。而且还造成死锁一次,手动解锁。
大家有什么好的建议么?
*/
...全文
289 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
being21 2010-11-28
  • 打赏
  • 举报
回复
回复3楼:
实际上真不该做这个测试,做这个研究。
我们的系统是每晚都有批量运行,白天是给客户使用的系统。
每晚8点批量运行。
这不是一个规范化的表,实际表有100多个字段,300万记录。
每天批量都会把300 万记录做一次更新。
大约25分钟执行时间。
和前端讨论过,批量运行,前端禁止访问批量操作表,被认为改动太大,不可行。
有个使用者,嫌我们系统慢(此系统,没人说快),让人设计了一个类似于刷票程序的程序,来执行需要重复操作的软件。晚上不定哪天就挂起来和我们批量一起在晚上跑。
和负责的业务人员讨论过,业务人员表示,无法约束这种行为,虽然我们知道是谁在做。建议我们自己禁止他操作。
太矛盾了,应该做的都不做,不该做的却在这里考虑。
所以···
如果程序设计人员能有好的数据库知识,这一切都不会发生,发生了的时候,实在是无解了。
epsilon-delta 2010-09-28
  • 打赏
  • 举报
回复
执行DDL时,oracle都会先commit本session的事务,也就是说你之前的lock table,在ddl运行时就释放了

其实你的杀进程的办法只是降低了被其他session锁表的可能性,实际在你杀玩进程后,运行ddl前,依然会有新的锁加上去的可能性

建议把ddl操作安排在业务空闲时间

如果要根除报错的话,只能考虑将对该表进行加锁的应用暂停,等该ddl程序完成后再启用
minitoy 2010-09-28
  • 打赏
  • 举报
回复
我比较好奇你为什么能连那么多,还有就是消失的3楼去了哪儿
being21 2010-09-28
  • 打赏
  • 举报
回复
居然没人关注···
being21 2010-09-12
  • 打赏
  • 举报
回复

DECLARE
v_errormsg VARCHAR2(200);
v_count NUMBER;
v_sessid VARCHAR2(50);
BEGIN
v_errormsg := 0;
v_count := 0;
LOOP
v_errormsg := 1;
BEGIN
<< kill_lock >>
LOOP
BEGIN
BEGIN
SELECT s.sid || ',' || s.serial# INTO v_sessid
FROM v$locked_object v
,dba_objects d
,v$lock l
,v$session s
WHERE v.object_id = d.object_id
AND v.object_id = l.id1
AND v.session_id = s.sid
AND d.object_name = 'ACRM_ERRLOG'
AND rownum = 1;
EXCEPTION
WHEN OTHERS THEN
EXIT;
END;
EXECUTE IMMEDIATE 'alter system kill session '||''''||v_sessid||'''';
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
END;
v_errormsg := 2;
BEGIN
EXECUTE IMMEDIATE 'rename ACRM_ERRLOG to ACRM_ERRLOGX';
EXCEPTION
WHEN OTHERS THEN
GOTO kill_lock;
END;
v_errormsg := 3;
EXECUTE IMMEDIATE 'rename ACRM_ERRLOGX to ACRM_ERRLOG ';
DBMS_LOCK.SLEEP(1);
v_count := v_count + 1;
EXIT WHEN v_count = 1000;
IF v_count = 10 THEN
dbms_output.put_line(v_count);
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(v_errormsg);
ROLLBACK;
RAISE;
END;
/*
根据实际环境,把DDL部分修改了。杀掉DML锁进程。
因为DML部分是我模仿前端程序对数据库的操作。
如果大家有不杀进程的方法,欢迎提供。
参考文档:一些 ORA-00054: resource busy and acquire with NOWAIT specified 文章
*/
being21 2010-09-12
  • 打赏
  • 举报
回复

/*
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
23 C00000009C37FDF8 C00000009C37FF70 73 TX 131092 220498 6 0 1092 0
24 C00000009C30CB08 C00000009C30CB30 73 TM 169756 0 3 0 1092 1
25 C00000009C30CBC8 C00000009C30CBF0 74 TM 169756 0 0 6 1064 0
*/
select * from v$lock;
/*
可以看见dml操作的sid 拥有两个锁,一个TX,一个TM。
*/

being21 2010-09-12
  • 打赏
  • 举报
回复
再补充一下,如果我单独执行一个
dml 语句,未提交,然后再执行那个DDL块,就会一直等待到dml提交。
但是在手动条件下成功。
being21 2010-09-12
  • 打赏
  • 举报
回复
补充一下错误信息:ORA-00054: resource busy and acquire with NOWAIT specified
我理解不了为什么我加LOCK TABLE ACRM_ERRLOG IN exclusive mode后,还能返回错误信息。
代码转载自:https://pan.quark.cn/s/50df8825dc0d Tensilica Xtensa指令集架构手册是一份详尽阐述Xtensa指令集架构(ISA)的参考指南,它主要面向Tensilica公司所推出的处理器核心,尤其是LX106核,同时亦涵盖了ESP8266和ESP32等相关内容。该手册全面介绍了Xtensa处理器核心的指令集、配置选项、扩展能力以及将架构映射至硬件的详细情况。接下来将依据手册中所述的知识点进行深入解读。 ### Xtensa指令集架构(ISA) Xtensa指令集架构是Tensilica公司为其处理器产品设计的一套指令集,该指令集具备高度的可配置性和可扩展性。这一特性使得Xtensa ISA能够在不同的应用领域和硬件需求中进行个性化定制,以满足特定的功能与性能要求。 #### 可配置性(Configurability) Xtensa ISA的可配置性体现在用户可以根据实际需求对处理器的多个方面进行定制。这包括但不限于: - **指令集扩展**:用户可以根据特定的应用需求添加新的指令,从而提升处理特定任务的效率。 - **寄存器文件扩展**:根据应用需求,可以增加或优化处理器的寄存器数量和类型。 - **协处理器扩展**:通过集成特定的协处理器,可以将专门的计算任务卸载到协处理器上,从而提升整体性能。 #### 可扩展性(Extensibility) Xtensa ISA不仅可配置,还拥有卓越的可扩展性,它支持多种扩展,包括: - **状态扩展(State Extensions)**:允许处理器添加新的状态寄存器,以支持新的功能或增强现有功能。 - **指令扩展(Instruction Extensions)**:...
下载代码方式:https://pan.quark.cn/s/8779ceeac982 YOLOv5被认为是一种功能卓越且精确度高的目标检测系统,它在即时处理场景中展现出优越的性能。"基于YOLOv5的火灾检测"计划致力于运用这项尖端的计算机视觉方法,以达成对火焰和烟雾的有效辨识,进而起到防止及降低火灾事故的作用。在这个压缩文件里,用户能够获取到预先训练完成的模型,这表示使用者能够直接执行推理检测,无需从头开始训练模型。 我们现在将详细探讨YOLO(You Only Look Once)系统。YOLO是一种单阶段的目标检测方法,它将目标检测任务转化成回归问题,通过直接预测边界框和类别可能性来迅速识别图像中的物体。YOLOv5是这一系列的最新迭代,由Ultralytics团队研发,它在前几代的基础上进行了改进,包括更迅速的训练速率、更精准的检测以及更强的适应性。 YOLOv5的关键优化包含: 1. **数据增强**:应用了Mosaic数据增强技术,这是一种融合了随机缩放、翻转、裁剪及色彩调节的技巧,增强了模型的普遍适用性。 2. **更高效的架构**:运用了SPP-Block(Spatial Pyramid Pooling)和Path Aggregation Network (PANet)设计,提升了特征提取的效能和精确度。 3. **权重初始化**:采用了更优化的权重初始化策略,使模型在初始训练阶段就能更快地达到收敛。 4. **联合训练**:YOLOv5支持多尺度训练,即同步训练不同尺度的网络,以改善对小目标的检测效果。 5. **优化的损失函数**:使用了GIOU(Generalized IoU)损失函数,改进了边界框的定位。 针对火灾检测的应用,YOLOv...

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧