Spring+Spring MVC+Mybatis栈如何解决数据库与Web页并发数据不一致问题
并发下拉框数据一致性解决方案
核心处理原则
不建议只返回通用插入失败让用户手动刷新页面,该场景属于非常典型的读写并发冲突,已有成熟的分层解决方案,对用户可以做到基本无感知或者仅需轻量操作。
分层落地方案
1. 后端业务校验层(必做,核心防线)
- 所有提交请求中涉及关联表的参数,必须在业务层先校验对应记录的存在性,不要等到插入时触发数据库报错再处理。你当前用MyBatis可直接编写对应主键的count查询逻辑,校验不通过直接返回友好错误。
- 错误返回需要明确告知用户「您选择的[对应业务字段名]已被删除,请重新选择」,同时把最新的下拉框可选列表同步在错误返回结果中返回,前端直接替换本地下拉框选项即可,无需刷新整个页面。
2. 数据库层(兜底防线)
- 涉及关联关系的表字段必须加外键约束,就算业务层漏做校验,数据库也会直接阻止无效关联数据插入,避免脏数据入库。你可以在Spring的全局异常处理器中统一捕获
SQLIntegrityConstraintViolationException这类外键约束异常,转换为上述的友好提示返回前端。 - 若业务场景允许保留历史关联关系(比如订单关联已下架的商品),可以改用逻辑删除方案:给关联表加
is_deleted标记字段,仅做软删除不物理删除数据,提交时如果检测到选中的是已软删除的记录,可根据业务规则判断是允许提交保留历史关联,还是拒绝提交提示用户重新选择。
3. 前端优化层(体验升级)
- 拉取下拉框选项时,同步返回当前关联数据的版本号/最后更新时间戳,提交请求时把该版本号一并传给后端,后端检测到版本号低于当前最新版本时,直接返回最新选项列表让前端更新,提前避免无效提交。
- 若页面用户停留时长较长,可以配置30s~1min的短轮询拉取关联数据的更新状态,有变更时前端自动更新下拉框选项,用户提交前就能看到最新数据,从根源上避免选到已删除记录的问题。
4. 高一致性场景增强方案
- 对一致性要求极高的业务,可以给关联表加乐观锁版本字段,每个下拉框option除了存业务值外,还附带对应记录的当前版本号,提交时同时校验记录存在性和版本号一致性,版本不匹配直接返回最新数据,能覆盖记录被修改、删除等所有变更场景。
对应技术栈落地提示
- 你使用的Spring+Spring MVC+MyBatis栈可直接把关联数据存在性校验封装为通用的自定义校验注解,配合Spring Validation框架做声明式校验,减少重复代码。
- 统一封装返回体结构,给「关联数据不存在」的场景定义单独的业务错误码,前端接到对应错误码时自动执行下拉框选项更新+提示逻辑,无需额外适配。
内容的提问来源于stack exchange,提问作者dragoncat12138
相关产品推荐
相关产品推荐

