Много транзакций в одних и тех же таблицах, - PullRequest
0 голосов
/ 14 февраля 2012

Мы используем приложение на сервере с Sql-сервером, и оно получает много SDF-файлов от клиентов для обновления базы данных SqlServer, обновления для многих таблиц, и я использую Transaction для этого, приложение на сервере используется несколькими пользователями, чем это возможно два обновления в одно и то же время и два с транзакцией, приложение выдает исключение, что таблица используется другой транзакцией !!

Новая транзакция не разрешена, поскольку в сеансе запущены другие потоки.

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

Есть идеи?

Обновление: есть код для моей функции: это мои функции с транзакцией, запущенной в BackgroundWorker с таймером:

         DbTransaction trans = ConnectionClass.Instance.MasterConnection.BeginTransaction();
           try
           {
             ClientDalc.UpdateClient(ChosenClient, trans);
             // other functions with the same transaction               

             trans.Commit();
           }
           catch (Exception ex)
           {
              trans.Rollback();
              return false;
           }

Клиент обновления:

        public static bool UpdateClient(ClientEntity ChosenClient, DbTransaction trans)
    {

        bool retVal = true;
        string sql = "UPDATE ClientTable Set ........";



        try
        {
            using (DbCommand cmd = DatabaseClass.GetDbCommand(sql))
            {
                cmd.Transaction = trans;
                cmd.Parameters.Add(DatabaseClass.GetParameter("@Name", Client.Name));
                //
                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            retVal = false;
        }

        return retVal;
    }

Если я запускаю что-то еще в то же время, когда выполняется BackgroundWorker, я получаю исключение, даже если это не транзакция

ExecuteReader требует, чтобы команда имела транзакцию, когда назначенное команде соединение находится в ожидающей локальной транзакции. Свойство Transaction команды не было инициализировано. ”

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Является ли это полностью потерянной публикацией?

Единственная ссылка, которую я нахожу на эту ошибку, указывает на Entity Framework, а не на Sql-сервер, и я никогда не видел, чтобы в SQL-сервере - на самом деле, у SQL-сервера нет подходящегона сессию вообще.Они называются соединениями там.

SqlException от Entity Framework - Новая транзакция не разрешена, поскольку в сеансе выполняются другие потоки

В этом случае ваше описание итегирование имеет смысл ZERO, и единственный ответ - использовать EntityFramework PROPERLY - т.е. не многопоточное.Открывать отдельные сессии для потока.

0 голосов
/ 14 февраля 2012

Попробуйте выполнить пример кода C #

using (SqlConnection con = new SqlConnection("Your Connection String"))
{
    using (SqlCommand cmd = new SqlCommand("Your Stored Procedure Name", con))
    {
        SqlParameter param = new SqlParameter();
        param.ParameterName = "Parameter Name";
        param.Value = "Value";
        param.SqlDbType = SqlDbType.VarChar;
        param.Direction = ParameterDirection.Input;
        cmd.Parameters.Add(param);
        cmd.ExecuteNonQuery();
    }
}

Попробуйте выполнить образец хранимой процедуры

Create Proc YourStoredProcedureName
@ParameterName DataType(Length)
As
Begin
   Set NoCount On
   Set XACT_ABORT ON
   Begin Try
      Begin Tran
         //Your SQL Code...
      Commit Tran 
   End Try

   Begin Catch
      Rollback Tran
   End Catch
End

Предложения

  1. Сделайте вашу транзакцию максимально короткой.
  2. Когда вы добавляете запись в таблицу, она определенно заблокирует ресурс до транзакции.выполнен.Поэтому определенно другим пользователям придется подождать.
  3. В случае обновления вы можете использовать элементы управления параллелизмом
...