diff options
author | Machiavelli <machiavelli.trinity@gmail.com> | 2011-01-13 20:07:09 +0100 |
---|---|---|
committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-01-13 20:07:09 +0100 |
commit | cf9250c29f4e66f6a8fe6d14ace798a4252ce59b (patch) | |
tree | 00e9983260a4c20f7ffef1e2a2b05ba30d8b4772 /src/server/shared/Database/Transaction.cpp | |
parent | 8d59953f9372c6876e0cd8078b44de6893082cbe (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-x | src/server/shared/Database/Transaction.cpp | 47 |
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; } |