Что произойдет, если транзакция. Rellback/Commit никогда не вызывался до закрытия соединения?
public DBStatus InsertUpdateUserProfile(Int64 UserID, W_User_Profile oUser)
{
MySqlConnection oMySQLConnecion = null;
MySqlTransaction tr = null;
DBStatus oDBStatus = new DBStatus();
try
{
oMySQLConnecion = new MySqlConnection(DatabaseConnectionString);
if (oMySQLConnecion.State == System.Data.ConnectionState.Closed || oMySQLConnecion.State == System.Data.ConnectionState.Broken)
{
oMySQLConnecion.Open();
}
tr = oMySQLConnecion.BeginTransaction();
if (oMySQLConnecion.State == System.Data.ConnectionState.Open)
{
string Query = @"INSERT INTO user .....................;"
INSERT IGNORE INTO user_role ....................;";
MySqlCommand oCommand = new MySqlCommand(Query, oMySQLConnecion);
oCommand.Transaction = tr;
oCommand.Parameters.AddWithValue("@UserID", UserID);
oCommand.Parameters.AddWithValue("@AddressID", oUser.AddressID);
................
................
int sqlSuccess = oCommand.ExecuteNonQuery();
if (sqlSuccess>0)
{
tr.Commit();
oDBStatus.Type = DBOperation.SUCCESS;
oDBStatus.Message.Add(DBMessageType.SUCCESSFULLY_DATA_UPDATED);
}
oMySQLConnecion.Close();
}
else
{
oDBStatus.Type = DBOperation.ERROR;
oDBStatus.Message.Add(DBMessageType.ERROR_DUE_TO_NO_DB_CONNECTION);
}
return oDBStatus;
}
catch (Exception ex)
{
if (oMySQLConnecion.State == System.Data.ConnectionState.Open)
{
tr.Rollback();
oMySQLConnecion.Close();
}
oDBStatus.Type = DBOperation.ERROR;
oDBStatus.Message.Add(DBMessageType.ERROR_OR_EXCEPTION_OCCURED_WHILE_UPDATING);
oDBStatus.InnerException.Add(ex.Message);
return oDBStatus;
}
}
В приведенной выше функции я делаю Commit, если транзакция прошла успешно, и Rollback, если она не работает и соединение все еще включено.
Если соединение разорвано, отката нет. Я прочитал много мест, в которых говорится, что это будет автоматический откат, если соединение завершается без Commit (что я хочу). Это плохая практика? Я мог бы добавить try-catch после установления соединения, но добавить немного кода во все подобные функции. Это действительно необходимо?
Что произойдет, если транзакция. Rellback/Commit никогда не вызывался до закрытия соединения?
В MySQL транзакция откатывается. Но некоторые другие серверы таблиц фиксируют это при закрытии соединения.
Совет профессионала: не полагайтесь на это поведение, кроме как на способ справиться с тяжелым сбоем.
Close
. Используйтеusing
. Он вызовет Dispose, а dispose откатит незаконченную транзакцию. Это нормальная практика. Было бы невозможно обработать определенные сценарии, если бы он не откатывался обратно на Dispose.