2017-09-13 70 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。一旦我有結果,我會更新確認它的工作...