在对已在 MariaDB 中收到 INSERT 的 table 执行 SELECT 时接收延迟数据
Receiving delayed data when doing a SELECT over a table which has received an INSERT in MariaDB
我在 PHP 应用程序中使用 MariaDB。问题如下:将 Doctrine DBAL 与 MySQL 适配器一起使用我从一页插入,然后重定向到另一页,其中完成了 SELECT。两者都是非常基本的查询。
问题是 SELECT 反映的不是实际数据,而是较旧的数据。我在共享主机上托管此应用程序,因此请注意我不会提供所有数据库配置 options/permissions。
我试过在第一次 INSERT 后刷新,但它也不起作用,它仍然显示过时的数据。我相信如果数据发生变化,查询缓存就会失效,并且它们不适用,因为实际上,这是一个不同的查询。
我也不使用事务,所以提交应该是在插入之后完成的。关于如何获取最新数据的任何想法?
听起来您正在执行复制,并且用于定向查询的代理没有注意到 "Critical Reads"。
在复制设置中(MariaDB 或 MySQL),有一台主服务器和一台从服务器(至少)。 INSERTs
(和其他写入)必须发生在 Master 上。然后它们被复制到从站。 SELECTs
,另一方面,可以在任一服务器上完成,但是,为了分担负载,最好在从属服务器上完成它们。
复制是 "asynchronous"。也就是说,写入最终会发送到 Slave 并在那里执行。通常,延迟是亚秒级的。但是,由于多种原因,延迟可能会任意大。人们不应该依赖于复制写入的速度。
但是...有一种东西叫做"Critical Read"。这是 SELECT
需要 "see" 刚刚写的东西的时候。
你有一个 "critical read".
我不知道是什么决定将您的 SELECT
指向一个奴隶。
如果您正在使用 MariaDB 的 Galera 集群选项,那么您可以通过将 select 更改为
来保护自己免受关键读取问题的影响
SET SESSION wsrep_sync_wait = 1;
SELECT ... (as before)
SET SESSION wsrep_sync_wait = 0;
但是; SETs
必须与 SELECT
转到相同的 'node'。不知道正在进行什么样的代理,我不能更具体。
我希望您不会在每个语句之前重新连接。那就太糟糕了。
More on Galera issues for developers
如果你正在使用复制并且 Doctrine DBAL 没有任何关键读取,向他们投诉!
我在 PHP 应用程序中使用 MariaDB。问题如下:将 Doctrine DBAL 与 MySQL 适配器一起使用我从一页插入,然后重定向到另一页,其中完成了 SELECT。两者都是非常基本的查询。
问题是 SELECT 反映的不是实际数据,而是较旧的数据。我在共享主机上托管此应用程序,因此请注意我不会提供所有数据库配置 options/permissions。
我试过在第一次 INSERT 后刷新,但它也不起作用,它仍然显示过时的数据。我相信如果数据发生变化,查询缓存就会失效,并且它们不适用,因为实际上,这是一个不同的查询。
我也不使用事务,所以提交应该是在插入之后完成的。关于如何获取最新数据的任何想法?
听起来您正在执行复制,并且用于定向查询的代理没有注意到 "Critical Reads"。
在复制设置中(MariaDB 或 MySQL),有一台主服务器和一台从服务器(至少)。 INSERTs
(和其他写入)必须发生在 Master 上。然后它们被复制到从站。 SELECTs
,另一方面,可以在任一服务器上完成,但是,为了分担负载,最好在从属服务器上完成它们。
复制是 "asynchronous"。也就是说,写入最终会发送到 Slave 并在那里执行。通常,延迟是亚秒级的。但是,由于多种原因,延迟可能会任意大。人们不应该依赖于复制写入的速度。
但是...有一种东西叫做"Critical Read"。这是 SELECT
需要 "see" 刚刚写的东西的时候。
你有一个 "critical read".
我不知道是什么决定将您的 SELECT
指向一个奴隶。
如果您正在使用 MariaDB 的 Galera 集群选项,那么您可以通过将 select 更改为
来保护自己免受关键读取问题的影响SET SESSION wsrep_sync_wait = 1;
SELECT ... (as before)
SET SESSION wsrep_sync_wait = 0;
但是; SETs
必须与 SELECT
转到相同的 'node'。不知道正在进行什么样的代理,我不能更具体。
我希望您不会在每个语句之前重新连接。那就太糟糕了。
More on Galera issues for developers
如果你正在使用复制并且 Doctrine DBAL 没有任何关键读取,向他们投诉!