alter table xx disable table lock问题

超叔csdn 2010-01-25 03:58:55
为了防止误删除,我用如下语句加了锁:alter table xx disable table lock;

这个星期我想更新这个表,在解锁的时候提示我: resource busy and acquire with nowait specified

解锁用的这个:alter table xx enable table lock;

请问是哪里用错了吗,请高手解答!
...全文
695 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh62592855 2010-01-26
  • 打赏
  • 举报
回复
呵呵 要不你把你的测试代码贴上来看看
超叔csdn 2010-01-26
  • 打赏
  • 举报
回复
怪哉。为何我在同一session下测试都有问题。
是不是与数据库配置有关?

不知道有没有哪位测试的时候遇到我同样的情况?
超叔csdn 2010-01-26
  • 打赏
  • 举报
回复
SQL> create table qc_pivot3 tablespace bidm_data as select * from qc_pivot;

Table created.

SQL> commit;

Commit complete.

SQL> alter table qc_pivot3 disable table lock;

Table altered.

SQL> alter table qc_pivot3 enable table lock;

这步就出不来了。
wh62592855 2010-01-25
  • 打赏
  • 举报
回复
我刚也在同一个session里测试了一下好像没什么问题
wh62592855 2010-01-25
  • 打赏
  • 举报
回复
TABLE LOCK

Oracle Database permits DDL operations on a table only if the table can be locked during the operation. Such table locks are not required during DML operations.

Note:

Table locks are not acquired on temporary tables.

ENABLE TABLE LOCK
Specify ENABLE TABLE LOCK to enable table locks, thereby allowing DDL operations on the table. All currently executing transactions must commit or roll back before Oracle Database enables the table lock.
Caution:
Oracle Database waits until active DML transactions in the database have completed before locking the table. Sometimes the resulting delay is considerable.

DISABLE TABLE LOCK
Specify DISABLE TABLE LOCK to disable table locks, thereby preventing DDL operations on the table.
crazylaa 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sbaz 的回复:]
不是啊,我在同一个session中执行这2个alter语句都会有问题。
貌似都做不出来,上面的信息是一个朋友向我求助,可惜我也没碰到他那种情况。
[/Quote]
同一个session,测试了下,貌似没问题。
SQL> create table test(id number);

表已创建。

SQL> insert into test values(1);

已创建 1 行。

SQL> commit;

提交完成。

SQL> alter table test disable table lock;

表已更改。

SQL> alter table test enable table lock;

表已更改。

SQL> alter table test disable table lock;

表已更改。

SQL> drop table test;
drop table test
*
ERROR 位于第 1 行:
ORA-00069: cannot acquire lock -- table locks disabled for TEST


SQL> insert into test values(2);

已创建 1 行。

SQL> alter table test enable table lock;

表已更改。

SQL> drop table test;

表已丢弃。
超叔csdn 2010-01-25
  • 打赏
  • 举报
回复
不是啊,我在同一个session中执行这2个alter语句都会有问题。
貌似都做不出来,上面的信息是一个朋友向我求助,可惜我也没碰到他那种情况。
liusong_china 2010-01-25
  • 打赏
  • 举报
回复
应该是这个表被其他用户锁住了. 如select ... for update nowait

查看一下都有哪些锁,释放掉应该就可以了。
crazylaa 2010-01-25
  • 打赏
  • 举报
回复
因为有事务没有commit或rollback,所以资源正忙,导致alter取不到exclusive lock。
跟加锁解锁没关系。
参考:

解决ORA-00054: resource busy 的一种途径
2008-11-20 09:35
最近工作中遇到了一个小问题。在对table做ddl的时候遇到错误ORA-00054: resource busy and acquire with NOWAIT specified。这个错误很好理解也很好模拟出来。下面给出一种解决方法

首先我们来模拟一下现实的情况:

sesssion A :

SQL> create table tt1(x int);

Table created.


SQL> insert into tt1 values(1);

1 row created.

session B:

SQL> alter table tt1 modify (x default -1);
alter table tt1 modify (x default -1)
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

session B 想将x的default值改为-1时需要获得table的exclusive lock(其他的一些想获得table的exclusive lock的操作也一样),因为session A没有提交,所以session B 会失败。

在真实环境中我们无法控制其他的session何时提交,也不知道有哪些新的session会进来,所以只能想到通过写一段小程式来解决。

declare
default_v1 varchar2(20);
b_time varchar2(20);
e_time varchar2(20);
do_count number;
begin
dbms_output.enable(1000000);
do_count := 0;
select to_char(sysdate,'YYYYMMDD HH24MISS') into b_time from dual;
dbms_output.put_line('begin at: '||b_time);
loop
select data_default into default_v1 from user_tab_columns
where table_name='TT1' and column_name='X';

if default_v1 is null then
begin
do_count := do_count+1;
dbms_application_info.set_client_info('Try the ' || do_count||'th time');
execute immediate 'alter table TT1 modify (X default -1)';
exception
when others then
null;
end;
else
select to_char(sysdate,'YYYYMMDD HH24MISS') into e_time from dual;
dbms_output.put_line('finished at: '||e_time);
exit;
end if;
dbms_lock.sleep(1);
end loop;
end;
/

每隔一秒中尝试去获得exclusive lock。另外将尝试的次数通过dbms_application_info.set_client_info写入到client_info中。可以从v$session中client_info中读出来。

当然对于繁忙的系统,这样频繁的尝试也得不到exclusive lock,所以如果尝试一段时间后还不能获得的话,应该考虑放到下次系统停机的时间来执行。
  • 打赏
  • 举报
回复
主要是因为有事务正在执行(或者事务已经被锁),所以导致执行不成功。
用dba权限的用户查看数据库都有哪些锁
根据sid查看具体的sql语句,如果sql不重要,可以kill
kill该事务
内容概要:本文围绕“阶梯碳下考虑P2G-CCS与供需灵活响应的IES优化调度”展开,基于Matlab平台构建综合能源系统(IES)在阶梯式碳交易机制下的优化调度模型。研究深度融合电制气(P2G)与碳捕集、利用与封存(CCS)技术,结合需求侧灵活响应机制,旨在提升系统的低碳运行能力与经济性。通过建立多能流耦合的优化模型,协调电力、天然气、热力等多种能源形式的协同调度,有效降低系统碳排放强度,并借助YALIMIP工具包调用求解器进行高效求解。文档提供了完整的代码实现、模型构建流程与结果分析方法,涵盖从问题建模到仿真实现的全过程,具备较强的可复现性与科研参考价值。; 适合人群:具备电力系统、能源系统或优化建模相关背景的研究生、高校教师及工程技术人员,尤其适合从事综合能源系统、碳减排策略、P2G与CCS技术集成研究的专业人员,需熟练掌握Matlab编程与基本的数学规划知识。; 使用场景及目标:①用于研究阶梯式碳交易政策下综合能源系统的低碳经济调度策略;②支撑P2G-CCS技术与需求响应机制在IES中的仿真集成与性能评估;③作为撰写高水平学术论文(如EI/SCI收录)的技术基础与复现资源,推动碳中和背景下能源系统优化方向的创新研究。; 阅读建议:建议结合百度网盘提供的完整代码与资料包,按照模块逐步调试程序,重点理解目标函数的设计逻辑、碳交易成本的建模方式、约束条件的数学表达及求解器的配置方法,同时关注多能耦合设备的建模细节,配合公众号“荔枝科研社”获取持续的技术支持与案例拓展。
内容概要:本文系统研究了基于卷积神经网络(CNN)与支持向量机(SVM)融合的CNN-SVM混合模型在数据分类预测中的应用,尤其聚焦于工业故障识别领域。通过Matlab平台实现,该方法首先利用CNN强大的多层次特征提取能力对原始输入数据进行深度特征学习,自动捕获关键局部模式与空间结构信息,随后将提取的高层特征作为输入传递至SVM分类器,借助SVM在高维空间中小样本条件下卓越的分类性能与泛化能力完成最终判别任务。文中详尽阐述了模型的整体架构设计、网络参数配置、训练优化流程及特征迁移机制,充分结合了深度学习在特征表达上的优势与传统机器学习在分类决策上的稳健性。实验部分通过实际故障数据集验证了该混合模型相较于单一CNN或SVM模型在分类准确率、鲁棒性和抗过拟合能力方面的显著提升,证明了其在复杂故障诊断任务中的有效性与先进性; 适合人群:具备一定机器学习与深度学习理论基础,熟悉Matlab编程环境,从事故障诊断、模式识别、智能制造、电力系统监控或工业数据分析等相关领域的研究生、科研人员及工程技术开发者; 使用场景及目标:① 应用于旋转机械、电力设备、航空航天等领域的多类别故障识别与状态监测;② 掌握深度特征提取与传统分类器融合的技术路径,提升小样本、高噪声环境下数据分类的精度与可靠性;③ 为撰写高水平学术论文、开展科研项目或工程实践提供可复现的算法框架与完整代码支持; 阅读建议:读者应深入理解CNN与SVM的协同工作机制,重点分析特征提取层与分类层之间的接口设计,建议动手运行并调试所提供的Matlab代码,尝试在不同数据集上进行迁移实验与参数调优,以全面掌握该混合模型的应用技巧与优化策略。

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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