Как я могу откатить дочернюю транзакцию при возникновении ошибки в основной транзакции в .Net Core 2.1 - PullRequest
0 голосов
/ 27 октября 2018

Я использую две разные БД в своем проекте (.Net Core 2.1). Я не могу откатить дочернюю транзакцию, если в основных транзакциях произошла ошибка.

Ниже приведены шаги:

  1. Открыть новое соединение с транзакцией для DB1
  2. Выполнить операцию обновления таблицы пациентов для DB1 (успешно)
  3. Открыть новое соединение с транзакцией для DB2
  4. Выполнить операцию обновления таблицы пациентов для DB2 (успешно)
  5. Подтвердить транзакцию и закрыть соединение для DB2
  6. Выполнить операцию обновления таблицы пациентов для DB1 (произошла ошибка)
  7. транзакция отката для DB1
  8. Как откатить транзакции DB2?

Ниже приведены мои фрагменты кода.

public class CheckTransations
{
    public void CheckTran()
    {
        string strConnString1 = @"data source = 177.16.8.68\sqlexpress; initial catalog = DB1; persist security info = True; user id = sa; password = 99$indd; MultipleActiveResultSets = True; ";
        string strConnString2 = @"data source = 177.16.8.68\sqlexpress; initial catalog = DB2; persist security info = True; user id = sa; password = 99$indd; MultipleActiveResultSets = True; ";
        SqlTransaction objTrans1 = null;
        SqlTransaction objTrans2 = null;
        using (SqlConnection objConn1 = new SqlConnection(strConnString1))
        {
            objConn1.Open();
            objTrans1 = objConn1.BeginTransaction();
            SqlCommand objCmd1 = new SqlCommand("update Patient set chartNumber = 'C5' where PatientId = 5", objConn1, objTrans1);
            try
            {
                var PatientId = objCmd1.ExecuteNonQuery();
                using (SqlConnection objConn2 = new SqlConnection(strConnString2))
                {
                    objConn2.Open();
                    try
                    {
                        objTrans2 = objConn2.BeginTransaction();
                        SqlCommand objCmd2 = new SqlCommand("update Patient set ChartNumber = 'C029' where PatientId = 29", objConn2, objTrans2);
                        var PatientId2 = objCmd2.ExecuteNonQuery();
                        objTrans2.Commit();
                    }
                    catch (Exception ex)
                    {
                        objTrans2.Rollback();
                        throw;
                    }
                    finally
                    {
                        objConn2.Close();
                    }
                }
                objCmd1 = new SqlCommand("update Patient set chartNumber = 'C5' where PatietId = 1036", objConn1, objTrans1);
                var PatientId1 = objCmd1.ExecuteNonQuery();
                objTrans1.Commit();
            }
            catch (Exception ex)
            {
                objTrans1.Rollback();
            }
            finally
            {
                objConn1.Close();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...