Использование веб-API TransactionScope и таблицы SQL Server в оперативной памяти Проблема - PullRequest
5 голосов
/ 03 апреля 2019

Всякий раз, когда я обращаюсь к хранимой процедуре с таблицей в памяти через Web API TransactionScope, я получаю эту ошибку:

Текущая транзакция не может быть зафиксирована и не может поддерживать операции записи в файл журнала. Откат транзакции. Текущая транзакция не может быть зафиксирована и не может поддерживать операции записи в файл журнала. Откат транзакции. Текущая транзакция не может быть зафиксирована и не может поддерживать операции записи в файл журнала. Откат транзакции. В конце пакета обнаруживается незафиксированная транзакция. Откат транзакции

Я попытался выполнить эту же хранимую процедуру непосредственно в SQL Server Management Studio, и она работает нормально.

Кроме того, когда я удаляю TransactionScope из Web API, он также работает нормально. Но я хочу использовать TransactionScope внутри Web API

Внутри хранимой процедуры у меня есть следующие вещи:

SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
BEGIN TRY
 SELECT ITEMID FROM SAMPLE_IN_MEMORY_TABLE
           ----
END TRY
BEGIN CATCH
--
END CATCH

Внутри Web API следующим образом я использую хранимую процедуру

QueriesTableAdapter qa = new QueriesTableAdapter();

using (TransactionScope scope = new TransactionScope())
{
      qa.SpSampleInMemoeryAccess(g_OutParameter64);

      if (g_OutParameter64 > 0)
      {
          scope.Complete();
          Status = true;             
      }
      else
      {
          Status = false;
      }
   }
}

1 Ответ

0 голосов
/ 13 мая 2019

Вы меняете уровень изоляции в середине транзакции.

Уровень изоляции TransactionScope по умолчанию равен SERIALIZABLE , но внутри вашей хранимой процедуры вы меняете его на READ UNCOMMITTED (!!! надеюсь, что вы знаете, что делаете)конструктор.

...