我有两个应用程序访问同一个表。我只希望一个应用程序随时访问该表。
是否可以在方法开始时发出锁定并在结束时删除锁定? 此外,如果应用程序死亡,我们可以在锁定上设置超时值吗?
Java方法概述:
//read the table...
//do something with the data
//update the table
return;
答案 0 :(得分:2)
最简单的方法,可能是发布一个“更新选择”'锁定表中一行的语句,例如:
create table app_lock ( application_name varchar2(100) not null);
insert into app_lock values ('myapp');
commit;
select application_name from app_lock where application_name = 'myapp' for update;
然后,如果另一个会话尝试运行相同的SQL语句,它将阻塞,直到第一个会话释放锁。或者您可以指定超时值。例如,在10秒后超时:
select application_name from app_lock where application_name = 'myapp' for update wait 10;
通过发出提交或回滚来释放锁,或者如果应用程序死亡,它将与Oracle断开连接并回滚释放锁。
另一种选择是锁定表格:
lock table mytable in exclusive mode;
同样,此锁定一直持续到您的会话提交,回滚或断开连接。