aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Database/MySQLConnection.cpp
diff options
context:
space:
mode:
authorMachiavelli <machiavelli.trinity@gmail.com>2011-05-23 16:33:33 +0200
committerMachiavelli <machiavelli.trinity@gmail.com>2011-05-23 16:33:33 +0200
commit402198c5ff06c30fcbafc54e704a5e44e4911477 (patch)
treed86b83669e4696e18733e926be4c2b7c48ce29aa /src/server/shared/Database/MySQLConnection.cpp
parentf7ce41c4afe1ea4d7cf65fbd08895e2e8325f66c (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-xsrc/server/shared/Database/MySQLConnection.cpp21
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'"