嗨:我在Apache下运行用PHP7.0 OO风格编写的无状态(REST)Web服务。他们使用mysqli连接到AWS上的mariaDB实例。我们发现了数据库同步问题,但不确定问题出在何处或如何解决问题。
客户端对服务1的调用将插入一条记录,并返回由$ i_primary_key = $ this-> db-> insert_id,成功插入后检索的自动生成的主键;
下一次客户来电将使用该主键执行服务2,这将更新记录
由于服务1和2是单独的https调用,因此它们会创建自己的连接,资源等。
问题是有时服务2失败,抱怨带有这样一个主键的记录不存在。在从服务1获得结果后,再次尝试或人工延迟呼叫服务2,并且事情可以正常工作。
如何在插入后告诉mariaDB引擎或mysqli API刷新缓存?我只是猜测Service 1中的引擎/连接尚未将其资源提供给自己的内部服务器,因此引擎的其他客户端看不到最新的更改/数据。
有什么建议......?
由于
答案 0 :(得分:0)
“冲洗”只有一种方法没有发生:如果INSERT
处于未提交的交易中。
要进行调查,请找出“服务1”中使用autocommit
的值。如果它是“开”(或“1”),则无法解决问题。
如果autocommit为off(0),则服务1中的代码无法COMMIT
隐式事务。这是用户错误。相反,我更喜欢使用明确的BEGIN
... COMMIT
语句。
答案 1 :(得分:0)
我在mariaDB上发现了这一点: https://mariadb.com/kb/en/library/server-system-variables/#flush
冲洗
描述:通常,MariaDB在每个SQL语句之后将更改写入磁盘,并且操作系统处理将其同步(刷新)到磁盘。如果设置为ON,则服务器将在每个语句后将所有更改同步到磁盘。 命令行: - flush 范围:全球 动态:是的 数据类型:布尔值 默认值:OFF
...所以我要把它设置为ON。一旦我有结果,我会更新确认它正常工作......