AWS RDS 数据库无法读取刚刚写入数据库的记录

use*_*358 0 amazon-rds laravel eloquent

我看到一些使用 AWS RDS 数据库的 Laravel 代码出错。该代码将一条记录写入数据库,然后立即进行搜索以使用主键加载该记录,但没有得到任何结果。

如果我之后手动尝试,我会找到记录。如果我在代码中插入 1 秒的睡眠,它可以正常工作。

我已经尝试使用 Laravel 的读写主机单独设置。我也尝试将它们设置为同一台主机并且只使用一台主机。结果总是一样的。但是其他具有相同配置的环境没有错误。

RDS 中是否有选项需要更改才能在写入后立即可用。

Par*_*ras 5

错误是由于mySQL master-slave replication lag.

一个常见的错误是使用 mySQL 集群,然后在写入后立即执行读取。

由于读取发生在其中一台从/读取主机上,而写入发生在主服务器上,因此在读取时不会复制数据。

有几种方法可以纠正错误:

  1. 必须在主站(而不是从站)上立即执行读取操作。尽管您已经提到将其更改为单个主机,但人们在切换连接时经常会出错。请参阅此SO 帖子以在 Laravel 中正确切换连接
  2. 更简单的方法可能是使用Laravel 中的stickydatabase选项。注意:如果不小心仅用于您想要的用例,这可能会导致性能问题。从文档:

该sticky选项是一个可选值,可用于允许立即读取在当前请求周期内已写入数据库的记录。如果sticky启用该选项并且在当前请求周期内对数据库执行了“写入”操作,则任何进一步的“读取”操作都将使用“写入”连接。

  1. 最“不明显”的方法是不要在写入后立即执行读取。根据您的用例考虑是否可以避免这种情况。

  2. 其他方法:请参阅此SO 帖子