2017-02-11 3 views
1

Я пишу на C++ в отношении базы данных SQL Server. У меня есть объект с именем SQLTransaction, который, созданный в начале кода, отправляет «начать транзакцию» на SQL Server.Запрос ROLLBACK TRANSACTION не имеет соответствующей BEGIN TRANSACTION после ошибки SQL Server 8114

Затем я отправляю на сервер одно или несколько операторов SQL. Если все пойдет хорошо, я установил флаг в объекте SQLTransaction, чтобы он знал, что набор команд прошел хорошо. Когда объект SQLTransaction затем выходит из области видимости, он либо отправляет транзакцию фиксации, либо транзакцию отката на сервер в зависимости от состояния флага.

Это выглядит примерно так:

{ 
     TSQLTransaction SQLTran(); 

     try 
     { 
      Send(SomeSQLCommand); 
     } 
     catch(EMSError &e) 
     { 
      InformOperator(); 
      return; 
     } 

     SQLTran.commit(); 
    } 

Я имел SQL заявление, в одном из этих блоков, который послал бедную команду и эта команда бросила ошибку SQL 8114

Ошибка типа преобразования данных varchar to numeric

С тех пор я исправил эту конкретную проблему. Я не понимаю, что я также получил вторую ошибку SQL с сообщением

Запрос ROLLBACK TRANSACTION не имеет соответствующей BEGIN TRANSACTION.

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

Этот точно такой же объект SQLTransaction используется во многих местах моего приложения и всегда работал нормально. По некоторым причинам эта ошибка SQL обрабатывается по-разному. Существуют ли некоторые ошибки, которые SQL Server автоматически откатывает? Мне бы очень хотелось понять, что здесь происходит.

Благодаря

+0

Почему вы не можете поместить транзакционную логику в инструкцию SQL? –

ответ

0

Существует вариант соединения, SET XACT_ABORT, что определяет судьбу текущей транзакции (ы), когда SQL оператор выдает сообщение об ошибке. В основном, когда установлено значение OFF, транзакция (обычно) сохраняется и выполнение продолжается; если это ON, все открытые транзакции в текущем соединении откатываются назад, а пакет прекращается.

Опция может быть установлена:

  1. На уровне соединения;
  2. Различные драйверы доступа к базе данных могут иметь разные значения по умолчанию для параметров подключения;
  3. Значение экземпляра SQL Server по умолчанию.

Проверьте, не изменились ли какие-либо из них в последнее время. Кроме того, если вы захватили трассировку в SQL Profiler, в событии «ExistingConnection» перечислены текущие настройки соединения. Вы всегда можете проверить состояние опции там и вывести его из строя, если он выключен. В этом случае я бы посмотрел ближе к трассе, могут быть дополнительные команды, отправленные на сервер, которые не явны из вашего кода клиента.

Смежные вопросы