如何在刚插入的记录上解决mysqli-mariaDB更新失败

时间:2017-09-13 17:06:30

标签: mysqli synchronization mariadb

嗨:我在Apache下运行用PHP7.0 OO风格编写的无状态(REST)Web服务。他们使用mysqli连接到AWS上的mariaDB实例。我们发现了数据库同步问题,但不确定问题出在何处或如何解决问题。

  1. 客户端对服务1的调用将插入一条记录,并返回由$ i_primary_key = $ this-> db-> insert_id,成功插入后检索的自动生成的主键;

  2. 下一次客户来电将使用该主键执行服务2,这将更新记录

  3. 由于服务1和2是单独的https调用,因此它们会创建自己的连接,资源等。

  4. 问题是有时服务2失败,抱怨带有这样一个主键的记录不存在。在从服务1获得结果后,再次尝试或人工延迟呼叫服务2,并且事情可以正常工作。

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

    有什么建议......?

    由于

2 个答案:

答案 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。一旦我有结果,我会更新确认它正常工作......