我们有一个名为 Contracts 的表。这些合同记录由外部站点的用户创建,必须由内部站点的工作人员批准或拒绝。当合同被拒绝时,它只是从数据库中删除。但是,当它被接受时,会生成一条名为 Contract Acceptance 的新记录,该记录将写入其自己的表中,并从合同中存在的数据派生而来。
问题是两名内部员工最终可能会各自打开同一份合同。第一个用户接受并生成合同接受记录。然后,在页面上仍然打开相同的合同记录的情况下,第二个用户再次接受合同,创建重复的接受记录。
解决这个问题的快速而肮脏的方法是在合同被接受之前从数据库中检索合同,检查状态,并产生一条错误消息,说明它已被接受。这可能适用于大多数情况,但用户仍然可以同时单击接受按钮并通过此验证码偷偷摸摸。
我还考虑过数据层深处的线程锁,它可以防止两个线程同时进入相同的代码区域,但是应用程序存在于两个负载平衡的服务器上,因此用户可以在不同的服务器上使这种方法无用。
我能想到的唯一方法必须存在于数据库中。从概念上讲,我想以某种方式锁定存储过程或表,使其不能同时更新两次,但也许我在这里对 Oracle 的了解不够。更新如何工作?更新请求是否以某种方式排队,以便它们不会同时发生?如果是这样,我可以检查 SQL 中记录的状态,并在 out 参数中返回一个值,说明它已被接受。但是如果更新请求没有排队,那么两个人仍然可以同时进入更新 sql。
寻找有关如何解决此问题的好建议。