Получить заголовок транзакции из объекта SqlTransaction - PullRequest
0 голосов
/ 07 января 2019

При создании объекта SqlTransaction с использованием BeginTransaction("MyTransactionName"), есть ли способ получить имя транзакции из возвращенного объекта транзакции?

Идея состоит в том, что когда моя транзакция завершается неудачно, я хочу записать имя транзакции, так как система многопоточная, и могут возникнуть некоторые взаимоблокировки, которые необходимо обработать.

Объект logger в моем примере кода является нашим собственным компонентом, и это очень тривиальный пример, так как большая часть кода не может быть размещена здесь.

 using (SqlConnection myConnection = new SqlConnection(SQLConnectString)) {
     myConnection.Open();
     SqlTransaction transaction = myConnection.BeginTransaction("UpdateTransaction");

     //The update methods are omitted here for brevity

     try {
         logger.Log("Attempt commit ");
         transaction.Commit();
     } catch (Exception ex) {
         logger.Error("Commit failed - " + ex.Message, ex.StackTrace);
         //At this point, I want to write the name of the failed
         //transaction into the log.
     }
}

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Попробуйте добавить еще один блок catch

catch (SqlException ex)
    {
        for (int i = 0; i < ex.Errors.Count; i++)
        {
            errorMessages.Append("Index #" + i + "\n" +
                "Message: " + ex.Errors[i].Message + "\n" +
                "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                "Source: " + ex.Errors[i].Source + "\n" +
                "Procedure: " + ex.Errors[i].Procedure + "\n");
        }
       logger.Error(errorMessages.ToString());
    }
0 голосов
/ 07 января 2019

Я уверен, что вы ищете что-то намного более элегантное, но иногда простое исправление сработает. Просто сохраните имя в переменной, выходящей за пределы try / catch:

using (SqlConnection myConnection = new SqlConnection(SQLConnectString)) 
{
     myConnection.Open();
     string txName = "UpdateTransaction";    
     SqlTransaction transaction = myConnection.BeginTransaction(txName);

     //The update methods are omitted here for brevity

     try 
     {
         logger.Log("Attempt commit ");
         transaction.Commit();
     }
     catch (Exception ex) 
     {
         logger.Error($"Commit transaction {txName} failed - " + ex.Message, ex.StackTrace);
     }    
}

Не идеально, так как он создает строковую переменную, которая впоследствии будет собираться мусором, но он выполняет свою работу.

Обновление:

Глядя на справочный источник , не видно, что имя хранится где-либо, поэтому нет способа извлечь его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...