如何使用事务数据库创建关键部分?

时间:2011-07-01 18:42:41

标签: database oracle critical-section

假设我有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
}

这会起作用,还是我错过了一些概念?

1 个答案:

答案 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值空间投射到已知数量的锁上,从而接受延迟不相关事务的(低)风险。