Java 使用锁保持提交更改

Java 使用锁保持提交更改,java,oracle,jdbc,transactions,locking,Java,Oracle,Jdbc,Transactions,Locking,我有一个处理数据库表的应用程序,比如 Id、state、procdate、result 当需要处理某些数据时,应用程序会将状态设置为处理。处理后,处理结果被设置为result列,状态变为STANDBY 要将第一个设置设置为处理我启动事务,请执行选择更新,然后更新状态和procdate。 然后,我进行工作,并使用选择更新更新状态和结果 处理过程可能最多需要5分钟。需要进行状态切换以查看有多少行正在进行。问题是,可能会发生另一个处理请求,它必须等到第一个处理结束。 所以我想保持排锁。如果在提交处理状

我有一个处理数据库表的应用程序,比如
Id、state、procdate、result

当需要处理某些数据时,应用程序会将状态设置为
处理
。处理后,处理结果被设置为
result
列,状态变为
STANDBY

要将第一个设置设置为
处理
我启动事务,请执行
选择更新
,然后更新状态和procdate。 然后,我进行工作,并使用
选择更新
更新状态和结果

处理过程可能最多需要5分钟。需要进行状态切换以查看有多少行正在进行。问题是,可能会发生另一个处理请求,它必须等到第一个处理结束。 所以我想保持排锁。如果在提交处理状态后立即选择更新以锁定,则第二个请求可能会截获并锁定该行


那么,如何保持锁定和提交更改呢?

您需要在设计中处理这一点。这里有一个想法

  • 您的记录最初的状态为“就绪”,处理id为空
  • 启动时,将状态更新为“正在处理”,并将id更新为作业运行的值,这可能来自Oracle中的序列,因此它对于流程运行是唯一的。承诺
  • 进程以相同的id运行,并选择状态“正在处理”,与定义的处理id相同。完成处理,将状态更新为“已完成”(或“备用”)。承诺

  • 这允许第二个进程选择新的“就绪”记录,并将它们设置为自己的处理,而不干扰已经运行的进程。

    以下是我采用的两种方法。(我提供了第三种方法,但从未采取过这种方法。)

    1) 为什么不在提交更改后退出事务

    2) 如果选项1不可行,您可以简单地:

    • 提交更改
    • 尝试重新获取锁,如果失败,请离开屏幕,否则继续
    <P>3)如果在一项承诺中没有人能够获得锁,这是绝对必要的。实际上,您可以锁定另一个对象。我承认,我从来没有采取过这种方法,但具体如下:

    初始阶段

    • 锁定全局对象
    • 尝试获取表的记录锁
    • 解锁全局对象
    • 测试以查看是否达到记录锁定
    提交更改的阶段

    • 锁定全局对象
    • 提交更改
    • 获取表的记录锁
    • 解锁全局对象
    • 测试以查看是否达到记录锁定(不应发生…)
    我从来都不需要这种逻辑,我真的不喜欢它,因为它需要这个表的全局锁定对象。同样,这取决于您的代码,以及某人能够在事务中提交更改的重要性


    但是,只要确保在提交更改后退出交易时,您的代码没有镀金就可以了。

    您不能这样做。也许你需要重新考虑你的设计?那太可悲了。也许我需要。但我不知道怎么做。有任何书籍、文章或会议视频吗?