From e36fb12359c7dcd7f74b1c9bf8ddfcbad44d273a Mon Sep 17 00:00:00 2001 From: jackpoz Date: Wed, 11 Feb 2015 22:42:46 +0100 Subject: Shared/Database: Improve dead-lock error handling Improve dead-lock error handling by making sure only 1 thread at time retries to execute a transaction so they don't keep dead-locking each other. (cherry picked from commit 62001360dd1d08b2f33fba0f20425867b1b0a069) --- src/server/shared/Database/Transaction.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/server/shared/Database/Transaction.cpp') diff --git a/src/server/shared/Database/Transaction.cpp b/src/server/shared/Database/Transaction.cpp index b83b787a106..9f36d198bde 100644 --- a/src/server/shared/Database/Transaction.cpp +++ b/src/server/shared/Database/Transaction.cpp @@ -19,6 +19,8 @@ #include "Transaction.h" #include +std::mutex TransactionTask::_deadlockLock; + //- Append a raw ad-hoc query to the transaction void Transaction::Append(const char* sql) { @@ -81,6 +83,8 @@ bool TransactionTask::Execute() if (errorCode == ER_LOCK_DEADLOCK) { + // Make sure only 1 async thread retries a transaction so they don't keep dead-locking each other + std::lock_guard lock(_deadlockLock); uint8 loopBreaker = 5; // Handle MySQL Errno 1213 without extending deadlock to the core itself for (uint8 i = 0; i < loopBreaker; ++i) if (!m_conn->ExecuteTransaction(m_trans)) -- cgit v1.2.3