除非提交表单,否则如何在数据库中锁定ID

时间:2015-11-04 07:34:13

标签: java spring-mvc oracle11g

我有一个表单,显示一个唯一的ID,表单将在该表单下提交。 唯一ID是DB + 1

中的最后一个唯一ID

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

因此,用户可能经常看到他的表单ID(该唯一ID),表单实际上可能无法在该唯一ID下提交,因为如果其他人(user2)在此期间提交表单, 然后,User1的表单将以唯一的id + 2值提交。

我的问题是,如何在用户打开表单并提交表单之前锁定持续时间的ID。

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

2 个答案:

答案 0 :(得分:0)

我看到两个选项

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

答案 1 :(得分:0)

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

一种更好的方法是仅在表单提交后通知用户id。事先可能对他们没有用处。

无论如何,锁的确切实现取决于你的数据库,但是类似于: 开始交易 从foo中选择max(id) [以某种方式增加id] [等待用户提交] 插入foo值(new_id) 提交

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