大家好,又见面了,我是你们的朋友全栈君。
只有插入有主键约束的列,或者有唯一约束的列时才可能会阻塞。
示例: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;
异常处理开销是很大的,所以最好的解决方法还是用序列来处理。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150607.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...