【发布时间】:2019-03-05 22:50:10
【问题描述】:
假设我有一个 SPA 应用程序来管理具有以下结构的用户详细信息(姓名、年龄等):
SPA my-api-servcie.com VIP [my-api-server-1.com, my-api-server-2.com]
API 使用 SpringBoot、Java、Spring JDBC、oracle 12c 构建
我想强制名称是唯一的。但是,我无法控制数据库架构,也无法向名称列添加唯一约束。无论如何,我确实实施了以下预防措施:
- 前端级别
- 验证以防止重名
- 停留全屏微调器以防止意外点击
- API 级别
- 验证以防止重名
了解上述所有情况后,其中一位应用程序用户成功发送了 2 个 POST 请求,这两个请求均成功通过了上述所有验证。
调用看起来像这样,每个请求需要几毫秒才能完成:
POST my-api-server-1.com/user {name:"Sam"} at 15-JUN-18 02.11.20.000000000 PM
POST my-api-server-2.com/user {name:"Sam"} at 15-JUN-18 02.11.23.000000000 PM
首先这两个请求都成功了,即使它们相隔近 2 秒,这似乎很奇怪。所以从技术上讲,第二次调用不应该通过 API 级别的验证。这种行为的原因是什么?是否有一些短期兑现 JDBC 或 Oracle 层?
第二,除了添加数据库约束之外,我还可以采取哪些其他预防措施?
我可以使用同步方法,但这会导致一些性能后果。
【问题讨论】:
-
根据用户名同步访问
-
如果您在服务器上使用,这将起作用。但是,在此我使用多个服务器
-
但是您可以使用另一个集中式数据库来同步仅访问。或者使用单独的集中服务仅进行用户注册。您还可以使用 Hazelcast 等跨集群同步 java 结构。作为最后的手段,使用表锁定。
标签: java spring oracle spring-boot jdbc