Oracle-怎么防止oracle锁表

发布于 2017-01-10 23:05:30 字数 85 浏览 1349 评论 1

例如我用客户端连接到了oracle数据库,在进行传输数据时候。程序异常退出,或者电脑断电。等非正常情况操作,会导致锁表。有没有什么方法可以避免这些意外情况。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

晚风撩人 2017-02-18 16:51:11

只有插入有主键约束的列,或者有唯一约束的列时才可能会阻塞。

示例:create table t(x int primary key);

session 1:

insert into t values(1);

session 2:

insert into t values(1);

这时session 2就会发生阻塞。

解决这种情况最好的方法就是在列上绑定一个序列,如果没有这么做,你也可以创建一个before触发器在插入前捕获resource_busy异常来防止阻塞:

create or replace trigger t_trigger
before insert on t for each row
declare
p_lockid pls_integer;
p_resource_busy exception;
pragma exception_init(p_resource_busy,-54);
begin
p_lockid:=dbms_utility.get_hash_value(to_char(:new.x),1,22554);
if(dbms_lock.request(id=>p_lockid,timeout=>0,lockmode=>dbms_lock.x_mode,release_on_commit=>true)<>0)
then
raise p_resource_busy;
end if;
end;

异常处理开销是很大的,所以最好的解决方法还是用序列来处理。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文