通过锁定保持提交更改

时间:2017-04-25 19:34:50

标签: java oracle jdbc transactions locking

我有一个适用于数据库表的应用程序 Id, state, procdate, result

当需要处理某些数据时,应用会将状态设置为PROCESSING。处理完毕后,处理结果设置为result列,状态转为STANDBY

要将第一个设置设为PROCESSING,我启动事务,执行select for update,然后更新状态并进行更新。 然后我完成工作并使用selection for update更新状态和结果。

处理时间可能长达5分钟。需要状态切换才能查看正在进行的行数。问题是可能发生另一个处理请求,它必须等到第一个处理结束。 所以我想保持行锁定。如果我在提交处理状态后立即进行选择以进行锁定,则第二个请求可能会拦截并锁定该行。

那么我怎样才能保持锁定并提交更改?

2 个答案:

答案 0 :(得分:0)

您需要在设计中处理此问题。这是一个想法。

  1. 您的记录最初具有状态,例如'READY'和处理ID,最初为null。
  2. 启动时,将状态更新为“PROCESSING”,并将id更新为作业运行的值,这可以来自Oracle中的序列,这样对于您的流程运行它是唯一的。提交。
  3. 该进程以相同的id运行,并选择状态“PROCESSING”并与其定义的处理ID相同。完成处理,将状态更新为“COMPLETE”(或“STANDBY”)。提交。
  4. 这允许第二个进程选择新的“READY”记录并将它们设置为自己的处理,而不会干扰已经运行的进程。

答案 1 :(得分:0)

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

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

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

  • 提交更改
  • 尝试重新获取锁,如果失败,请离开屏幕,否则请继续。

3)如果绝对没有必要在提交过程中获得锁,那么您实际上可以锁定另一个对象。我承认,我从来没有采用这种方法,但是它如下:

初始阶段

  • 锁定GLOBALOBJECT
  • 尝试获取表的记录锁定
  • 解锁GLOBALOBJECT
  • 测试以查看是否已获得记录锁定

提交更改的阶段

  • 锁定GLOBALOBJECT
  • 提交更改
  • 获取表的记录锁定
  • 解锁GLOBALOBJECT
  • 测试是否已获得记录锁定(永远不会发生...)

我从不需要这种逻辑,而且我真的不喜欢它,因为它需要该表的GLOBAL锁定对象。同样,这取决于您的代码,以及能够在仍在事务中进行更改的人员的重要性。

但是,只需确保在提交更改后退出交易时就不会对代码进行镀金处理,对您的涉众来说就可以了。