nginx負載平衡造成的資料查詢不同步

來源:互聯網
上載者:User
關鍵字 php mysql nginx
生產環境用nginx實現A、B兩台伺服器的負載平衡, A、B共用同一個資料庫
裝置一個PHP介面做了資料 儲存唯一性的判斷,不存在則儲存,存在就不存。
如今發現裝置在 同一時間同樣的資料請求了 三次介面,資料庫竟然發現了 三條同樣的資料。
現在可以肯定的是介面程式沒有問題。
那麼,問題出在哪裡?又該怎麼最佳化呢?

開始我認為是程式邏輯問題,但是我用相同的資料 for迴圈4次,發現只能儲存一次,其他三次返回資料重複的錯誤碼

回複內容:

生產環境用nginx實現A、B兩台伺服器的負載平衡,A、B共用同一個資料庫
裝置一個PHP介面做了資料儲存唯一性的判斷,不存在則儲存,存在就不存。
如今發現裝置在同一時間同樣的資料請求了三次介面,資料庫竟然發現了三條同樣的資料。
現在可以肯定的是介面程式沒有問題。
那麼,問題出在哪裡?又該怎麼最佳化呢?

開始我認為是程式邏輯問題,但是我用相同的資料 for迴圈4次,發現只能儲存一次,其他三次返回資料重複的錯誤碼

你用for沒有問題是因為,for是一個一個處理的。

一個是加唯一索引
一個是使用事務,然後查詢時候存在的時候用select for update
一個是通過隊列來處理

並發大了就會出現問題,即使是單台伺服器。
1.中間加一次redis計數,incr 原子操作。
2.資料表加唯一欄位索引,讓資料庫來解決這個問題。

你這個是指同一個用戶端一次請求造成了3次請求+資料 還是3個用戶端請求

問題出在這裡:儲存唯一性的判斷,不存在則儲存,存在就不存。

你這裡沒有做事務。

A判斷不存在,這時候B正寫入了一個,然後A已經判斷不存在,A又寫了一個。

應該把判斷不存在和寫入一個放在一個事務裡處理。

如果資料庫引擎不支援事務,要自己實現事務鎖。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.