【问题标题】:How to lock an id in database unless a form get submitted除非提交表单,否则如何锁定数据库中的 ID
【发布时间】:2016-02-04 14:38:27
【问题描述】:

我有一个表单,其中显示了将提交表单的唯一 ID。 唯一 id 是 DB+1 中的最后一个唯一 id

现在,当表单在 DB 中提交时,它实际上并没有直接在 db 中插入该唯一 ID。 然后动态检查db的最后一个唯一id,然后插入最后一个id+1。

因此,经常会出现这样的情况,即用户看到的表单 id(那个唯一 id)实际上可能不会在该唯一 id 下提交,因为如果其他人(user2)同时提交表单, 那么 User1 的表单将在唯一的 id+2 值下提交。

我的问题是,如何在用户打开表单到提交的这段时间内锁定 id。

如果您不清楚问题,请告诉我。 但这对于大型业务应用程序来说是一件非常棘手且重要的事情。请给我建议。

【问题讨论】:

  • @stefan 感谢您的回复。但我想你没有得到这个问题。

标签: java spring-mvc oracle11g


【解决方案1】:

我看到两个选项

  • 在插入之后显示 ID,而不是之前。如果用户取消怎么办?你会浪费很多身份证。好的,有很多,但我可以想象 DoS 攻击的样子。
  • 如果您需要该 ID 为用户提供参考 ID 以供以后与支持人员联系,或者只需创建一个与技术主键不同的 ID 应用程序。此 ID 可以在插入之前计算出来,并且还可以为您省去麻烦,因为技术 ID 在迁移方案中可能会发生变化。

【讨论】:

  • 感谢您的回复。但是考虑一下......在表单提交之前显示唯一ID真的非常重要。如果用户取消,id 将丢失,这不是一个大问题。但是在整个期间锁定该 ID 的方法是什么?
【解决方案2】:

锁定不是一个好主意,尤其是对于大型业务应用程序。所有其他并发请求(人)都必须等到当前用户提交表单。用户将经历较长的响应时间,应用服务器资源将饱和,即使负载非常小,应用程序也会崩溃。

一个更可取的方法是仅在表单提交后通知用户 id。事先对他们来说可能不是有用的信息。

无论如何,锁的具体实现取决于您的数据库,但类似于: 开始交易 从 foo 中选择 max(id) [不知何故增加ID] [等待用户提交] 插入 foo 值(new_id) 提交

但同样,你应该避免采用这种方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2022-01-12
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多