簡體   English   中英

使用多個DB結果執行MySQL替換為select以使其死鎖

[英]Executing MySQL replace into select using multiple DB results to deadlock

我檢查了其他類似的問題,例如堆棧溢出中的“MySQL中的死鎖”,但沒有任何問題導致解決方案。

REPLACE INTO db2.table2 (id, some_identifier_id, name, created_at, updated_at) (SELECT id, some_identifier_id, name, created_at, updated_at FROM db1.table1 WHERE some_identifier_id IS NOT NULL AND some_identifier_id NOT IN (SELECT some_identifier_id FROM db2.table1 WHERE some_other_identifier_id IS NOT NULL));

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

情況:

  1. 所有表都是InnoDB ; db1.table1 => 排序 規則 :latin1_swedish_ci和db2 => 排序規則 :utf8_unicode_ci
  2. 查詢在開發服務器中工作正常,其中版本為Server version:10.0.15-MariaDB
  3. 假設我有5台DB服務器,它們使用Galera集群共享多主機復制
  4. 我正在這5個服務器中的任何一個中手動執行查詢並獲得錯誤。
  5. 該服務器的版本與查詢執行成功的開發服務器相同,即10.0.15-MariaDB

嘗試:

  1. 包含LOCK IN SHARE MODE,例如REPLACE INTO ...(第一個選擇查詢(子查詢)LOCK IN SHARE MODE); 但它失敗了同樣的消息。
  2. 插入/替換 ...(第一個選擇查詢(子查詢鎖定共享模式)鎖定共享模式); 它也失敗了同樣的消息。
  3. 嘗試在select查詢/子選擇查詢中按id排序 再次失敗了相同的消息。
  4. db1.table1和db2.table1都有幾乎只有50k的記錄,所以這不應該導致任何問題我猜。
  5. 所有表都有id作為主鍵和自動增量 但我明確地使用它們 - 請觀察查詢。
  6. SHOW ENGINE INNODB狀態 ; 不會給我添加任何有用的提示。

最可能的原因可能是由於galera集群背后的多主復制導致其樂觀鎖定http://www.severalnines.com/blog/avoiding-deadlocks-galera-set-haproxy-single-node-writes-and -multi-node-reads )。 但是, 在單個節點上執行查詢時,這應該不會失敗? 雖然成功但我要在多主復制中執行相同但我想如果基本問題得到解決,那么復制的服務器將不再產生問題。

注意:

我需要在沒有任何臨時表的情況下執行此操作或將子查詢的結果存儲在代碼中。 還有一些其他依賴關系,到目前為止,執行單個查詢是最有利的方式。

好的,我找到了解決方法。 根據我的研究和測試,我認為這個失敗背后有兩個問題。

  1. 替換為查詢是將id與db1.table1中的其他必填字段同步到db2.table2。 插入/替換自動增量主鍵是galera中最可能和最明顯的死鎖原因。 我已從該查詢中刪除了id,並將some_identifier_id保留為支持相同替換查詢的唯一鍵。 它幾乎停止了死鎖錯誤。

不要依賴自動增量值來順序。 Galera使用基於自動增量增量的機制來產生唯一的非沖突序列,因此在每個節點上序列都會有間隙。 https://mariadb.com/kb/en/mariadb/mariadb-galera-cluster-known-limitations/

  1. 但仍有相同的死鎖信息發生1/10次,這是加萊拉的已知行為。 Galera使用樂觀鎖定; 很少導致死鎖; 在這種情況下,大多數人建議再次重試該事務。

Galera Cluster在集群級別的樂觀並發控制中使用,這可能導致在該階段發出COMMIT中止的事務。 http://galeracluster.com/documentation-webpages/limitations.html

在一個gist-查詢中,在單個服務器中成功運行,但是當它是galera時,則失敗了。 從該查詢中刪除自動增量主鍵並處理相同的事務以在死鎖上重新啟動解決了該問題。

[編輯]

  1. 我寫過一篇文章來解釋模式,環境,問題以及我如何使用它。 對面臨同樣問題的人可能有用。

  2. 問題向社區報告並公開

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM