zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

oracle如何防止锁表,Oracle-怎么防止oracle锁表[通俗易懂]

Oracle 如何 怎么 通俗易懂 防止 锁表
2023-06-13 09:11:32 时间

大家好,又见面了,我是你们的朋友全栈君。

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

示例: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;

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/150607.html原文链接:https://javaforall.cn