2017-09-13 145 views
0

您好:我在Apache下运行使用PHP7.0 OO风格编写的无状态(REST)Web服务。他们使用mysqli连接到AWS上的mariaDB实例。我们发现了一个数据库同步问题,并不确定问题出在哪里或如何解决。如何在刚刚插入的记录上解决mysqli-mariaDB更新失败

  1. 客户呼叫到服务1将插入一个记录,并返回由$ i_primary_key = $这个 - > DB-> INSERT_ID,后成功插入检索的自动生成的主密钥;

  2. 下一个客户端调用将使用该主键执行服务2,将更新

  3. 自服务1和2是分开的HTTPS电话,他们创建自己的连接,资源等方面的记录

问题是,有时服务2失败,抱怨带有这种主键的记录不存在。在获得服务1的结果后再尝试或人工延迟呼叫服务2,并且事情按照他们应该的方式工作。

如何告诉mariaDB引擎或mysqli API在插入后刷新其缓存?我只是猜测服务1中的引擎/连接尚未将其资源提供给其自己的内部服务器,因此引擎的其他客户端不会看到最新的更改/数据。

有什么建议吗?

感谢

回答

0

只有一个用于“刷新”不是已经发生的方法:如果INSERT是在未提交的事务。

要调查,找出什么值autocommit正在使用“服务1”。如果它是“开”(或“1”),那么问题就不存在了。

如果自动提交关闭(0),则服务1中的代码未能通过隐含事务处理COMMIT。这是一个用户错误。相反,我倾向于使用明确的BEGIN ... COMMIT陈述。

+0

嗨:autocommit是1.正如我写的,这些服务大多工作。有一段时间它不会。实际上它只发生在我们的测试环境中,在那里我们通过编程方式生成调用轰击服务器......将尝试明确的START/COMMIT,它应该有所帮助,但不确定我们是否解决了根本原因,因为autocommit已经= 1。 , 会尝试。 –

+0

您是否在每次查询后检查错误? –

+0

嗨:启动和提交没有帮助。 INSERT总是对服务1的调用者起作用,因为它确实获得了插入的键值。没有错误。决不。问题是服务2调用者,即使他知道这个键,当他执行服务2时,更新,更新有时会失败,并且记录不存在。所以,回到原来的问题,如上所述。 API-to_Engine级别存在更深层次的问题。 –

0

我发现这个读了上MariaDB的: https://mariadb.com/kb/en/library/server-system-variables/#flush

冲洗

说明:通常情况下,MariaDB的每个SQL语句之后写入到磁盘的变化,以及操作系统处理同步(冲洗)到磁盘。如果设置为ON,服务器将在每个语句后将所有更改同步到磁盘。 命令行:--flush 范围:全球 动态:是 数据类型:布尔 默认值:OFF

...所以我打算将其设置为ON。一旦我有结果,我会更新确认它的工作...