Java 读-检查-在数据库中写入标志
在程序中,我们可以通过使用同步块来控制多个进程访问数据库。我们可以在下面的场景中使用什么方法Java 读-检查-在数据库中写入标志,java,database,oracle,locking,Java,Database,Oracle,Locking,在程序中,我们可以通过使用同步块来控制多个进程访问数据库。我们可以在下面的场景中使用什么方法 从数据库读取列值-说flag 如果标志为零则将标志列更新为一 在应用程序中执行一组应受标志保护的处理(在标志设置为零之前,应用程序的其他实例不应执行此类操作) 将列标志再次更新为零 有多个应用程序实例指向同一个DB表执行上述操作。我们如何跨应用程序实例同步此过程 已完成的研究 阅读有关DB表锁和行锁的内容,但在我的例子中,读和写是两个操作,应该作为不同应用程序实例的工作单元来工作根据我的经验,您不能
- 从数据库读取列值-说
flag
- 如果
为标志
则将标志列更新为零
一
- 在应用程序中执行一组应受标志保护的处理(在
标志设置为零之前,应用程序的其他实例不应执行此类操作)
- 将列
再次更新为标志
零
阅读有关DB表锁和行锁的内容,但在我的例子中,读和写是两个操作,应该作为不同应用程序实例的工作单元来工作根据我的经验,您不能安全地使用列中的值作为“锁定”对象的方式。如果需要生成锁,我建议您使用DBMS_lock包中的例程,例如:
DECLARE
strLock_handle VARCHAR2(128);
iResult INTEGER;
excpAllocate EXCEPTION;
PRAGMA EXCEPTION_INIT(excpAllocate, -20000);
BEGIN
DBMS_LOCK.ALLOCATE_UNIQUE(lockname => 'YOUR LOCK NAME',
lockhandle => strLock_handle);
iResult := DBMS_LOCK.REQUEST(lockhandle => strLock_handle,
lockmode => DBMS_LOCK.X_MODE, -- exclusive mode
timeout => DBMS_LOCK.MAXWAIT,
release_on_commit => FALSE);
IF iResult = 0 THEN
-- Do what you need to do exclusively here - nothing else will be able to enter this
-- section as they'll stall on the DBMS_LOCK.REQUEST call above.
DBMS_OUTPUT.PUT_LINE('This is a stupid piece of example code');
-- Note: if we changed the RELEASE_ON_COMMIT parameter passed to DBMS_LOCK.REQUEST
-- above to TRUE, the following COMMIT would release all locks held
-- by this process for which RELEASE_ON_COMMIT was TRUE.
COMMIT;
-- Release the lock acquired above. This will allow one of the (possibly
-- many) processes stalled on the DBMS_LOCK.REQUEST above to proceed.
iResult := DBMS_LOCK.RELEASE(strLock_handle);
ELSE
-- Lock was not acquired. Reasons are:
-- iResult Reason
-- 1 Timeout
-- 2 Deadlock
-- 3 Parameter error
-- 4 Already own lock specified
-- 5 Illegal lock handle
DBMS_OUTPUT.PUT_LINE('DBMS_LOCK.REQUEST failed - iResult = ' || iResult);
END IF;
EXCEPTION
WHEN excpAllocate THEN
DBMS_OUTPUT.PUT_LINE('DBMS_LOCK.ALLOCATE failed : ' || SQLCODE || ' ' || SQLERRM);
END;
祝你好运。有多种解释需求的方法,它们有不同的解决方案。所以请澄清你的问题。“处理集”是否作用于带有
标志的表或其他表/数据集?是否只有一个通用于整个应用程序的标志实例,或者是否有多个标识多个“处理集”的标志实例?标志列是通用的,如果任何应用程序将标志设置为1,则其他应用程序不应执行任何操作。如果其他进程在其他人处理标志时尝试设置标志,您希望发生什么情况?请参阅选择。。。更新…很好的例子鲍勃。不幸的是,我认为它不能满足他的要求“读写是两个操作,应该作为一个工作单元从不同的应用程序实例中工作”。他的要求有些混乱:他不希望应用程序的其他实例能够做一些事情,但他希望应用程序的多个实例能够做一些事情。您如何知道哪些实例可以更新,哪些实例不可以更新。除非多个实例是在您的Do what you need to Do here部分中启动的。