我试图了解是否有可能实现以下目标:
我有一个在循环负载均衡器后面运行的应用服务器的多个实例。客户端在POST / PUT语义之后需要GET,特别是客户端将发出POST请求,等待响应并立即发出GET请求,期望响应反映POST请求所做的更改,例如:
> Request: POST /some/endpoint
< Response: 201 CREATED
< Location: /some/endpoint/123
> Request: GET /some/endpoint/123
< Response must not be 404 Not Found
无法保证两个请求都由同一个应用程序服务器处理。每个应用程序服务器都有一个与DB的连接池。每个请求都会在响应客户端之前提交事务。
因此,数据库将在一个连接上看到INSERT语句,然后是COMMIT。另一个连接,它将看到一个SELECT语句。暂时,SELECT将在提交后严格执行,但是可能只有毫秒级的微小延迟。
我想到的应用服务器使用Java,Spring和Hibernate。该数据库是由Amazon RDS在多可用区设置中管理的MySQL 5.7.11。
我试图了解是否可以实现此行为以及如何实现。有一个similar question,但建议锁定表的答案似乎不适合必须处理并发请求的应用程序。
答案 0 :(得分:2)
在一般情况下,您对这一系列请求不会有任何问题,因为您的MySQL将在201响应发送回来之前将更改提交到数据库。因此,任何后续语句都将看到创建/更新的记录。
后续选择无法找到更新/插入记录的特殊情况是什么?
另一个进程提交更改或删除语句,以更改或删除给定记录。你可以做的不多,因为它是正常操作的一部分。如果您不希望发生这种情况,那么您必须实现数据的应用程序级锁定。
后续GET请求不仅路由到不同的应用程序服务器,而且还使用(或被迫使用)不同的数据库实例,该实例没有该记录的最新状态。如果应用程序或数据库服务器级别出现严重故障,或者请求路由非常糟糕(路由到不同地理位置的数据中心),我会设想会发生这种情况。这些不应该经常发生。
答案 1 :(得分:-1)
如果你正在使用MyISAM表,你可能会看到并发插入的影响&#39; (参见mysql手册中的8.11.3)。您可以通过将concurrent_insert系统变量设置为0或在INSERT上使用HIGH_PRIORITY关键字来避免它们。