假设我有2台与同一交易数据库通信的服务器。
我想设置它,这两个服务器中只有一个将执行给定的定时操作(主要是使用数据库来强制执行同步)。从我所听到的情况来看,这可能有用:
假设我的表TABLE有2列,ID和STATUS。如果我这样设置代码:
update TABLE set STATUS = 'processing' where ID = 1234 and STATUS != 'processing'
if (weHaveModifiedAtLeastOneRow)
{
// do critical section stuff here
// This is code that we only want one server to run, not both.
update TABLE set STATUS = 'free' where ID = 1234
}
else
{
// We failed to get the lock, so do nothing
}
这会起作用,还是我错过了一些概念?
答案 0 :(得分:2)
如果您想要关键部分,请使用dbms_lock.request。您可以获得一个有意义的锁定句柄,通过这样分配唯一:
DBMS_LOCK.ALLOCATE_UNIQUE ( lockname => 'MYAPP_' || ID, lockhandle => handle);
success := DBMS_LOCK.REQUEST(lockhandle => handle, timeout => 1);
if (success = 0) then
-- Do stuff
DBMS_LOCK.release(handle);
else
-- we waited a second and didn't got the lock.
end if;
如果您愿意,可以在id上应用散列和模运算符,将id值空间投射到已知数量的锁上,从而接受延迟不相关事务的(低)风险。