与mysql和多个并发连接的写入一致性后读取

时间:2016-10-28 12:49:19

标签: mysql hibernate web-services amazon-web-services amazon-rds

我试图了解是否有可能实现以下目标:

我有一个在循环负载均衡器后面运行的应用服务器的多个实例。客户端在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,但建议锁定表的答案似乎不适合必须处理并发请求的应用程序。

2 个答案:

答案 0 :(得分:2)

在一般情况下,您对这一系列请求不会有任何问题,因为您的MySQL将在201响应发送回来之前将更改提交到数据库。因此,任何后续语句都将看到创建/更新的记录。

后续选择无法找到更新/插入记录的特殊情况是什么?

  1. 另一个进程提交更改或删除语句,以更改或删除给定记录。你可以做的不多,因为它是正常操作的一部分。如果您不希望发生这种情况,那么您必须实现数据的应用程序级锁定。

  2. 后续GET请求不仅路由到不同的应用程序服务器,而且还使用(或被迫使用)不同的数据库实例,该实例没有该记录的最新状态。如果应用程序或数据库服务器级别出现严重故障,或者请求路由非常糟糕(路由到不同地理位置的数据中心),我会设想会发生这种情况。这些不应该经常发生。

答案 1 :(得分:-1)

如果你正在使用MyISAM表,你可能会看到并发插入的影响&#39; (参见mysql手册中的8.11.3)。您可以通过将concurrent_insert系统变量设置为0或在INSERT上使用HIGH_PRIORITY关键字来避免它们。