Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读-检查-在数据库中写入标志_Java_Database_Oracle_Locking - Fatal编程技术网

Java 读-检查-在数据库中写入标志

Java 读-检查-在数据库中写入标志,java,database,oracle,locking,Java,Database,Oracle,Locking,在程序中,我们可以通过使用同步块来控制多个进程访问数据库。我们可以在下面的场景中使用什么方法 从数据库读取列值-说flag 如果标志为零则将标志列更新为一 在应用程序中执行一组应受标志保护的处理(在标志设置为零之前,应用程序的其他实例不应执行此类操作) 将列标志再次更新为零 有多个应用程序实例指向同一个DB表执行上述操作。我们如何跨应用程序实例同步此过程 已完成的研究 阅读有关DB表锁和行锁的内容,但在我的例子中,读和写是两个操作,应该作为不同应用程序实例的工作单元来工作根据我的经验,您不能

在程序中,我们可以通过使用同步块来控制多个进程访问数据库。我们可以在下面的场景中使用什么方法

  • 从数据库读取列值-说
    flag
  • 如果
    标志
    则将标志列更新为
  • 在应用程序中执行一组应受标志保护的处理(在
    标志设置为零之前,应用程序的其他实例不应执行此类操作)
  • 将列
    标志
    再次更新为
有多个应用程序实例指向同一个DB表执行上述操作。我们如何跨应用程序实例同步此过程

已完成的研究


阅读有关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部分中启动的。