Какой из них работает лучше? Транзакция в SQL Server или в C #? - PullRequest
0 голосов
/ 30 октября 2019

Я пишу хранимые процедуры с уровнем чтения незафиксированных транзакций, но по истечении времени ожидания отката отката в SQL не работает.

Когда я использую SqlTransaction на бизнес-уровне в .Net,проблема решена, и я могу поддержать любые ошибки, произошедшие в SQL, в моем try... catch в .Net.

Это то, что я сделал правильно?

using (SqlConnection conn = new SqlConnection(Data.DataProvider.Instance().ConnectionString))
{
    conn.Open();

    SqlTransaction tran = conn.BeginTransaction(IsolationLevel.ReadUncommitted, "Trans");

    try
    {
        object ores = SqlHelper.ExecuteScalar(.......)
        string res = ores.ToString();

        if (string.IsNullOrEmpty(res))
        {
            tran.Rollback();
            info.TrackingCode = "";
            return 0;
        }
        else if (res == "-4")
        {
            tran.Rollback();
            return -4;
        }
        else if (res == "-1")
        {
            tran.Rollback();
            return -1;
        }
        else
        {
            tran.Commit();
            return 1;
        }
   }
   catch (Exception)
   {
       tran.Rollback();
       info.TrackingCode = "";
       return 0;
   }

Ответы [ 3 ]

0 голосов
/ 30 октября 2019

Оба способа эквивалентны. Но в случае бизнес-уровня вы можете обрабатывать транзакции через несколько выполнений запросов.
Здесь вы должны обработать conn.Open() для возможных исключений. Кроме того, проверка SqlHelper использует созданное вами соединение и транзакцию везде в своем коде.

0 голосов
/ 30 октября 2019

Когда происходит событие тайм-аута клиента (например, .net CommandTimeout), клиент отправляет «ABORT» на SQL Server. SQL Server просто прекращает обработку запросов. Откат транзакции не производится, блокировки не снимаются. Я решил эту проблему с помощью Sqltransaction в моем .Net Code вместо Sql и управляю исключениями с SqlExceptions

0 голосов
/ 30 октября 2019

Согласно вашему требованию, существует два способа определения SqlTransaction

  1. SQL Server на стороне SqlTransaction
  2. C # .NET (бизнес-уровень) SqlTransaction.

(Оба не могут быть смешаны)

В вашем случае вы пытались определить SqlTransaction на бизнес-уровне. Так что лучше позвоните Stored-procedure тоже на бизнес-уровне. Таким образом, бизнес-уровень исправит SqlTransaction и ошибка тайм-аута не возникнет.

Поэтому сначала включите код Stored-Procedure в качестве выполнения команды (на бизнес-уровне), а затем выполните. Измените код, как показано ниже, с вашими необходимыми условиями.

                // Command Objects for the transaction
                SqlCommand cmd1 = new SqlCommand("YourStoredProcedureName", cnn);
                cmd1.CommandType = CommandType.StoredProcedure;

                //If you are using parameter for the Stored-procedure
                cmd1.Parameters.Add(new SqlParameter("@Param1", SqlDbType.NVarChar, 50));
                cmd1.Parameters["@Param1"].Value = paramValue1;

                //Execute stored procedure through C# code
                cmd1.ExecuteNonQuery();
                transaction.Commit();

РЕДАКТИРОВАНИЕ: Ссылочная ссылка

catch (SqlException sqlEx)
{
    if (sqlEx.Number == -2)
    {
       //handle timeout
    }
    transaction.Rollback();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...