表在ORACLE中被锁定,导致事务失败

时间:2019-06-10 19:00:23

标签: java oracle jdbc transactions

我在旧版代码库中确实存在以下情况-  'Team'表保存有关团队和柜台的信息。它具有名为'TEAM_NAME''COUNTER'的列。 正在事务中执行以下三步操作-

  • 在桌子上独占LOCK
  • 阅读与团队对应的柜台。
  • 使用该计数器并增加计数器值,然后将其保存回TEAM表。

执行完这些步骤后,请提交完整的操作。 由于第一步中对表采取了排他锁,因此其他并发事务失败。我想执行此操作而不会丢失系统中的事务。 我确实认为,如果我删除LOCK语句并使我的方法为Synchronized可以工作,但是我确实有4个JVM,但仍然存在并发事务。 请提出一些更好的设计方法来解决此问题。

1 个答案:

答案 0 :(得分:0)

您几乎永远不需要在Oracle中进行手册LOCK。如果这样做,您可能应该重新考虑自己在做什么。您可能应该做的是:

  1. 在与团队对应的桌上做SELECT ... FOR UPDATE。这将仅锁定该行,而不锁定整个表。在不同团队进行的并行会议可以免费继续。
  2. 做任何你想做的事。
  3. 运行UPDATE ...来更新计数器。

一个更简单的方法是:

  1. 执行UPDATE ... RETURNING my_counter INTO ...,这将返回计数器的更新值。
  2. 执行需要做的事情,请记住您拥有递增的计数器值。