diff options
| author | jackpoz <giacomopoz@gmail.com> | 2015-02-11 22:42:46 +0100 |
|---|---|---|
| committer | jackpoz <giacomopoz@gmail.com> | 2015-02-12 22:48:57 +0100 |
| commit | 62001360dd1d08b2f33fba0f20425867b1b0a069 (patch) | |
| tree | 3c96ded78e8aa047458ec4c73347dc012a614833 | |
| parent | 554e0c2e5d85a57646f8236bba959686212d65d8 (diff) | |
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.
| -rw-r--r-- | src/server/shared/Database/Transaction.cpp | 4 | ||||
| -rw-r--r-- | src/server/shared/Database/Transaction.h | 1 |
2 files changed, 5 insertions, 0 deletions
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 <mysqld_error.h> +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<std::mutex> 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)) diff --git a/src/server/shared/Database/Transaction.h b/src/server/shared/Database/Transaction.h index cf6aa98b386..83d59006ddc 100644 --- a/src/server/shared/Database/Transaction.h +++ b/src/server/shared/Database/Transaction.h @@ -66,6 +66,7 @@ class TransactionTask : public SQLOperation bool Execute() override; SQLTransaction m_trans; + static std::mutex _deadlockLock; }; #endif |
