【问题标题】:Thread Synchronization Issue in javajava中的线程同步问题
【发布时间】:2026-02-17 22:40:01
【问题描述】:

我正在使用 hibernate 开发 Soap WebServices 应用程序。我正在为每个订单生成 orderNumbers。为此,我有两个字段的下表

ORDER_SERIES LAST_ORDER_COUNT


250 欧元

要生成 ORDER_NO 首先我从上表中获取记录并将 LAST_ORDER_COUNT 增加 1 并附加 ORDER_SERIES

所以我的 ORDER_NO 将是 ORD251

之后我用新增加的 LAST_ORDER_COUNT 更新上表

ORDER_SERIES LAST_ORDER_COUNT


251 欧元

我已经编写了一个方法来执行此操作,这意味着从表中获取记录,增加 LAST_ORDER_COUNT 并附加两者并返回订单号并更新 LAST_ORDER_COUNT。我将此方法设为同步。

但在生产环境中我得到重复的 ORDER_NOs

我的肥皂网络服务正在通过 android apk 调用。

知道为什么 ORDER_NO 会重复

【问题讨论】:

  • 这是因为你的操作不是原子的。您使用的是什么 DBMS。其中大多数是内置的方法来自动创建唯一 ID。
  • 我正在使用 postgres 数据库
  • 我找到了解决上述问题的方法。我们可以在选择记录时使用“select for update”查询。当我们使用“选择更新”选择任何记录时,该记录被锁定,直到我们更新它。意味着没有两个线程可以从特定记录中获得相同的值

标签: java multithreading hibernate synchronization


【解决方案1】:

ID 应该是数据库中的自动增量,它也应该是一个主键/唯一键。如果您以后不这样做,那么当您同时有更多请求时,您将面临此类问题。

【讨论】: