Я могу изменить SQL Server, чтобы не было никаких откатов
Контекст:
У меня есть приложение, которое переносится с Jet на серверную часть SQL Server. Часть этого приложения включает настраиваемые пользователем "поиски". Поиски запускают транзакцию на текущем соединении, выполняют серию операторов, дают некоторые результаты и затем фиксируют изменения. Если есть ошибка, то я отправляю "ROLLBACK TRAN" и выдаю сообщение об ошибке.
К сожалению, я столкнулся с предполагаемыми откатами. Некоторые ошибки, например создание представления с безымянным столбцом, приводят к подразумеваемому откату, который откатывает все назад к первому "BEGIN TRAN". Это вызывает две проблемы. Первая проблема незначительна: когда я выполняю "ROLLBACK TRAN" (или откат к точке сохранения) в ответ на ошибку (которая мне понадобится для ошибок неявного отката), я получаю сообщение об ошибке, говорящее мне, что я могу ' Откат, потому что нет транзакций. Ничего страшного, я могу определить и игнорировать их.
Основная проблема, с которой я сталкиваюсь, заключается в том, что если я редактирую и проверяю результаты поиска, эта ошибка будет означать, что любые незафиксированные изменения в поиске также будут отменены, а форма будет в несогласованном режиме (по сути, она будет думать, что она находится в режиме редактирования)., но на самом деле это в режиме просмотра). Все это в настоящее время выполняется в рамках одного соединения, и переписать его будет очень сложно.
Я провел небольшое исследование по этому вопросу и думаю, что мне, возможно, придется перенести текущий поиск в другую назначенную таблицу и выполнить на отдельном соединении, но мне было интересно, есть ли более эффективное решение.
Вопрос:
Могу ли я изменить поведение SQL Server, чтобы ошибки не приводили к подразумеваемому откату?
Если я редактирую поиск, должен ли я переместить поиск в назначенную таблицу, а затем выполнить оттуда в отдельном соединении (таким образом я могу получить доступ к текущему поиску, не затрагивая предыдущую версию)?
Есть ли другой, более оптимальный подход?
PS: извиняюсь за стену текста, и если я нарушил сетевой этикет, на большинство моих простых вопросов уже был дан ответ, мне никогда не приходилось задавать вопрос раньше. Да здравствует всезнающий Гугл.
1 ответ
Оказывается, то, что я ищу, невозможно. SQL предназначен для автоматического отката до первого НАЧАЛА СДЕЛКИ при возникновении некоторых ошибок. Существует опция - рекомендуемая опция - изменить поведение SQL по умолчанию, чтобы автоматически откатываться все ошибки, а не только некоторые.
установить xact_abort на.