我有一个 POST API,您可以在其中为客户保存一些数据,有可能有人可以在毫秒/微秒时间内以编程方式使用相同的数据发起多个调用。
现在,当我接受第一个请求和处理时,其中包括验证(数据库读取),然后最终保存(数据库插入事务)。但是,如果插入需要一点时间才能完成,则其他请求会通过重复条目(数据库读取)的验证,然后一旦第一个请求完成,第二个请求就会在插入处等待,因为第一个请求会获得锁定,然后两次都会插入数据。
不能简单地对表中的唯一数据添加限制(考虑非规范化的数据库设计),并且数据库读取不会在未提交的读取情况下发生,并且涉及多个表
我想在请求到来时为客户创建一个唯一的密钥,并在请求过程完成后删除该密钥,直到客户无法访问该资源,但它可能有一些缺点。
寻找一些解决方案如何处理这些情况(想象一下 100 个 api 的情况,我不能简单地将所有验证写入数据库插入事务以回滚)。
数据集中不是有一个自然的客户唯一密钥吗?如果是,则针对它创建一个唯一键,然后数据库处理重复项。您只需在 api 代码中处理来自 db 的重复异常即可。如果您没有唯一的键标识符,则将所有字段视为复合键,并在数据库中创建唯一索引并遵循相同的过程。无论如何,我的建议是让 db 处理重复项。我假设您正在考虑的数据库具有内置的并发控制机制。希望这有帮助。