From cf9250c29f4e66f6a8fe6d14ace798a4252ce59b Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Thu, 13 Jan 2011 20:07:09 +0100 Subject: 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. --- src/server/shared/Database/MySQLConnection.cpp | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/server/shared/Database/MySQLConnection.cpp') diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp index 2a07fad7a9b..832a801f94b 100755 --- a/src/server/shared/Database/MySQLConnection.cpp +++ b/src/server/shared/Database/MySQLConnection.cpp @@ -369,6 +369,52 @@ void MySQLConnection::CommitTransaction() Execute("COMMIT"); } +bool MySQLConnection::ExecuteTransaction(SQLTransaction& transaction) +{ + std::queue &queries = transaction->m_queries; + if (queries.empty()) + return false; + + BeginTransaction(); + while (!queries.empty()) + { + SQLElementData data = queries.front(); + switch (data.type) + { + case SQL_ELEMENT_PREPARED: + { + PreparedStatement* stmt = data.element.stmt; + ASSERT(stmt); + if (!Execute(stmt)) + { + sLog->outSQLDriver("[Warning] Transaction aborted. %u queries not executed.", (uint32)queries.size()); + RollbackTransaction(); + return false; + } + delete data.element.stmt; + } + break; + case SQL_ELEMENT_RAW: + { + const char* sql = data.element.query; + ASSERT(sql); + if (!Execute(sql)) + { + sLog->outSQLDriver("[Warning] Transaction aborted. %u queries not executed.", (uint32)queries.size()); + RollbackTransaction(); + return false; + } + free((void*)const_cast(sql)); + } + break; + } + queries.pop(); + } + + CommitTransaction(); + return true; +} + MySQLPreparedStatement* MySQLConnection::GetPreparedStatement(uint32 index) { ASSERT(index < m_stmts.size()); @@ -462,6 +508,9 @@ bool MySQLConnection::_HandleMySQLErrno(uint32 errNo) return _HandleMySQLErrno(lErrno); // Call self (recursive) } + case 1213: // "Deadlock found when trying to get lock; try restarting transaction" + return true; // Implemented in TransactionTask::Execute and DatabaseWorkerPool::DirectCommitTransaction + // Query related errors - skip query case 1058: // "Column count doesn't match value count" case 1062: // "Duplicate entry '%s' for key '%d'" -- cgit v1.2.3