一名团队成员在使用旧的内部系统时遇到了问题,其中用户双击网页上的链接可能会导致从浏览器发送两个请求,从而导致在比赛中同一记录的两个数据库插入健康)状况; 最后一个运行失败,主键违规。已经提出并讨论了几种解决方案和技巧:
在网页上使用 Javascript 通过禁用第一次点击时的链接来减少第二次点击。这是减少问题发生的一种快速简便的方法,但不能完全消除它。
将服务器端的请求执行包装在事务中。由于相关表上的服务器负载和锁定级别,这被认为过于昂贵的操作。
捕获失败的插入引发的主键异常,将其识别为这样,然后吃掉它。这具有以下缺点:(a) 供应商锁定,必须知道特定于数据库的异常的细微差别,以及 (b) 可能不记录/处理合法的数据库故障。
#3 的扩展,通过在插入失败时尝试更新记录并检查更新结果以确保它返回 1 条受影响的记录。
是否还有其他未考虑的选项?被忽视的选项是否有优缺点?万恶之中,孰轻孰重?