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