[英]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
情況:
嘗試:
最可能的原因可能是由於galera集群背后的多主復制導致其樂觀鎖定 ( http://www.severalnines.com/blog/avoiding-deadlocks-galera-set-haproxy-single-node-writes-and -multi-node-reads )。 但是, 在單個節點上執行查詢時,這應該不會失敗? 雖然成功但我要在多主復制中執行相同但我想如果基本問題得到解決,那么復制的服務器將不再產生問題。
注意:
我需要在沒有任何臨時表的情況下執行此操作或將子查詢的結果存儲在代碼中。 還有一些其他依賴關系,到目前為止,執行單個查詢是最有利的方式。
好的,我找到了解決方法。 根據我的研究和測試,我認為這個失敗背后有兩個問題。
不要依賴自動增量值來順序。 Galera使用基於自動增量增量的機制來產生唯一的非沖突序列,因此在每個節點上序列都會有間隙。 https://mariadb.com/kb/en/mariadb/mariadb-galera-cluster-known-limitations/
Galera Cluster在集群級別的樂觀並發控制中使用,這可能導致在該階段發出COMMIT中止的事務。 http://galeracluster.com/documentation-webpages/limitations.html
在一個gist-查詢中,在單個服務器中成功運行,但是當它是galera時,則失敗了。 從該查詢中刪除自動增量主鍵並處理相同的事務以在死鎖上重新啟動解決了該問題。
[編輯]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.