1.oracle 读是不会阻塞写的;写也不会阻塞读;只有修改同一行数据的时候,两个写操作才会发生阻塞,这种情况下,只有写1提交了,写2才能操作。
2.读写互相不阻塞,这会带来一个问题。
如果想确保某些时刻,资源只能被一个用户访问,你需要多做些事情。打个比方,你上厕所的时候,不需要有人打扰吧,这时候你应该怎么办?把门锁上。oracle也这样。下面用一个例子说明。
create table resources(name varchar2(20) primary key);
create table schedules(resource_name varchar2(20),start_date date not null,end_date date not null,check(start_date < end_date),primary key(resource_name,start_date));
insert into resources values(‘厕所’);
过程:
procedure schedule_resource(i_resource_name in varchar2,
i_start_date in date,
I_end_date in date) as
v_count number;
v_resource_name resources.name%type;
begin
select name
into v_resource_name
from resources re
where re.name = i_resource_name
for update;
select count(1)
into v_count
from schedules sc
where sc.resource_name = v_resource_name
and sc.start_date <= I_end_date
and sc.end_date >= i_start_date;
if v_count <> 0 then
raise_application_error(-20000, ‘Rome is busy!’);
end if;
insert into schedules
(resource_name, start_date, end_date)
values
(i_resource_name, i_start_date, i_end_date);
end schedule_resource;
。