【发布时间】:2018-11-27 06:11:34
【问题描述】:
我的应用程序是基于表单的应用程序,用户可以在其中提出请求,将为该请求分配一个 ID,用户将填写一些详细信息,然后通过不同的阶段提交。多个用户可能是一个请求的一部分的问题,因此可能存在用户 A 和用户 B 同时查看表单的情况。用户A可能先提交,然后用户B提交,这会导致请求只显示用户B提交的信息。为了解决这个问题,我想出了两个解决方案:
-在我们将数据提交到数据库之前,我们会调用 get 来查看数据是否已经提交(我们在应用程序中使用状态。所以我们会检查“Stage # Pending”的状态)。
-我们为其他一些服务实现了 Redis 缓存。我可以添加类似
public submitRequest() {
RMap<String, int> requestLockMap = redissonClient.getMap("requestLock");
if(requestLockMap.get('request_ID') == 0) {
requestLockMap.put('request_ID', 1);
...continue submitting request...
}
}
这本质上是在 Redis 缓存中添加竞速条件。但是,我不知道这是否是这种事情的好习惯。有没有更好的选择?我使用 Spring 作为我们的 Java 框架,所以如果有任何解决方案,我愿意听取他们的意见。
【问题讨论】:
-
如果你使用hibernate,它已经有内置版本检查是否是更新。你为什么不使用它。
-
@AshraffAliWahab 我们使用 sql server 定义自己的 SQL,Java 不是 hibernate 吗?
-
Hibernate 用于 Java 连接到任何 RDBMS。所以 SQL 服务器不是问题。
-
@AshraffAliWahab 是的,但是您不使用 Hibernate 框架定义查询过程吗?我们所有的存储过程都是在我们运行的sql server中定义的。我们可以将过程移植到 Java 并在考虑 Hibernate 的情况下对其进行编码,但这需要付出巨大的努力。或者我可以将 Hibernate 合并到我们的 Java 项目中并使用它来调用存储的 proc 名称吗?
-
好的,知道了。那变化太大了。查看有关基于事务/会话的 SQL 服务器存储过程中的应用程序锁定的链接。 sqlteam.com/articles/…
标签: java race-condition