aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/shared/Database/Transaction.cpp4
-rw-r--r--src/server/shared/Database/Transaction.h1
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