aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Database/Transaction.cpp
diff options
context:
space:
mode:
authorMachiavelli <machiavelli.trinity@gmail.com>2011-01-13 20:07:09 +0100
committerMachiavelli <machiavelli.trinity@gmail.com>2011-01-13 20:07:09 +0100
commitcf9250c29f4e66f6a8fe6d14ace798a4252ce59b (patch)
tree00e9983260a4c20f7ffef1e2a2b05ba30d8b4772 /src/server/shared/Database/Transaction.cpp
parent8d59953f9372c6876e0cd8078b44de6893082cbe (diff)
Core/DBLayer:
- Implement DatabaseWorkerPool::DirectCommitTransaction for synchronous transaction execution (as opposed to asynchronous/enqueued). - Add MySQL errno 1213 "Deadlock found when trying to get lock; try restarting transaction" handler. If 1213 is called the core will retry to directly execute the transaction a maximum of 5 times.
Diffstat (limited to 'src/server/shared/Database/Transaction.cpp')
-rwxr-xr-xsrc/server/shared/Database/Transaction.cpp47
1 files changed, 9 insertions, 38 deletions
diff --git a/src/server/shared/Database/Transaction.cpp b/src/server/shared/Database/Transaction.cpp
index b09415c6c7c..8604dfc609c 100755
--- a/src/server/shared/Database/Transaction.cpp
+++ b/src/server/shared/Database/Transaction.cpp
@@ -67,45 +67,16 @@ void Transaction::Cleanup()
bool TransactionTask::Execute()
{
- std::queue<SQLElementData> &queries = m_trans->m_queries;
- if (queries.empty())
- return false;
+ if (m_conn->ExecuteTransaction(m_trans))
+ return true;
- m_conn->BeginTransaction();
- while (!queries.empty())
+ if (m_conn->GetLastError() == 1213)
{
- SQLElementData data = queries.front();
- switch (data.type)
- {
- case SQL_ELEMENT_PREPARED:
- {
- PreparedStatement* stmt = data.element.stmt;
- ASSERT(stmt);
- if (!m_conn->Execute(stmt))
- {
- sLog->outSQLDriver("[Warning] Transaction aborted. %u queries not executed.", (uint32)queries.size());
- m_conn->RollbackTransaction();
- return false;
- }
- delete data.element.stmt;
- }
- break;
- case SQL_ELEMENT_RAW:
- {
- const char* sql = data.element.query;
- ASSERT(sql);
- if (!m_conn->Execute(sql))
- {
- sLog->outSQLDriver("[Warning] Transaction aborted. %u queries not executed.", (uint32)queries.size());
- m_conn->RollbackTransaction();
- return false;
- }
- free((void*)const_cast<char*>(sql));
- }
- break;
- }
- queries.pop();
+ 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))
+ return true;
}
- m_conn->CommitTransaction();
- return true;
+
+ return false;
}