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