diff options
author | Machiavelli <machiavelli.trinity@gmail.com> | 2011-05-23 16:33:33 +0200 |
---|---|---|
committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-05-23 16:33:33 +0200 |
commit | 402198c5ff06c30fcbafc54e704a5e44e4911477 (patch) | |
tree | d86b83669e4696e18733e926be4c2b7c48ce29aa /src/server/shared/Database/MySQLConnection.cpp | |
parent | f7ce41c4afe1ea4d7cf65fbd08895e2e8325f66c (diff) |
Core/DBLayer: Proper core-side handling of MySQL errno 1213 to prevent a snowballeffect (until innodb_lock_wait_timeout)
Diffstat (limited to 'src/server/shared/Database/MySQLConnection.cpp')
-rwxr-xr-x | src/server/shared/Database/MySQLConnection.cpp | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp index accc89bfdc1..c242669192d 100755 --- a/src/server/shared/Database/MySQLConnection.cpp +++ b/src/server/shared/Database/MySQLConnection.cpp @@ -379,14 +379,16 @@ void MySQLConnection::CommitTransaction() bool MySQLConnection::ExecuteTransaction(SQLTransaction& transaction) { - std::queue<SQLElementData> &queries = transaction->m_queries; + std::list<SQLElementData> const& queries = transaction->m_queries; if (queries.empty()) return false; BeginTransaction(); - while (!queries.empty()) + + std::list<SQLElementData>::const_iterator itr; + for (itr = queries.begin(); itr != queries.end(); ++itr); { - SQLElementData data = queries.front(); + SQLElementData const& data = *itr; switch (data.type) { case SQL_ELEMENT_PREPARED: @@ -399,7 +401,6 @@ bool MySQLConnection::ExecuteTransaction(SQLTransaction& transaction) RollbackTransaction(); return false; } - delete data.element.stmt; } break; case SQL_ELEMENT_RAW: @@ -412,13 +413,16 @@ bool MySQLConnection::ExecuteTransaction(SQLTransaction& transaction) RollbackTransaction(); return false; } - free((void*)const_cast<char*>(sql)); } break; } - queries.pop(); } + // we might encounter errors during certain queries, and depending on the kind of error + // we might want to restart the transaction. So to prevent data loss, we only clean up when it's all done. + // This is done in calling functions DatabaseWorkerPool<T>::DirectCommitTransaction and TransactionTask::Execute, + // and not while iterating over every element. + CommitTransaction(); return true; } @@ -491,8 +495,6 @@ PreparedResultSet* MySQLConnection::Query(PreparedStatement* stmt) bool MySQLConnection::_HandleMySQLErrno(uint32 errNo) { - sLog->outSQLDriver("%s", __FUNCTION__); - switch (errNo) { case 2006: // "MySQL server has gone away" @@ -521,8 +523,7 @@ bool MySQLConnection::_HandleMySQLErrno(uint32 errNo) } case 1213: // "Deadlock found when trying to get lock; try restarting transaction" - return true; // Implemented in TransactionTask::Execute and DatabaseWorkerPool<T>::DirectCommitTransaction - + return false; // Implemented in TransactionTask::Execute and DatabaseWorkerPool<T>::DirectCommitTransaction // Query related errors - skip query case 1058: // "Column count doesn't match value count" case 1062: // "Duplicate entry '%s' for key '%d'" |