Выполнить команду SQL в случае разрыва моего соединения?(SQL Server) - PullRequest
3 голосов
/ 10 марта 2011

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

  1. Открыть соединение с сервером.
  2. Запустите команду UPDATE.
  3. Отойдите и сделайте что-то, что может занять значительное время.
  4. Запустите другое ОБНОВЛЕНИЕ, которое отменяет изменение в шаге 2.
  5. Закрыть соединение.

Но о-нет!На шаге 3 машина, на которой запущена эта программа, буквально взорвалась.Другие машины, запрашивающие ту же базу данных, теперь будут думать, что взорванная машина все еще работает и что-то делает.

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

(Чтобы предупредить ответ, я не ищу блокировки таблицы / записи или транзакции. Я неделать заявки на ресурсы здесь.)

Большое спасибо, billpg.

Ответы [ 3 ]

1 голос
/ 10 марта 2011

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

Если речь идет об одной команде SQL, строки которой для нее не должны изменяться, это проблема, которая должна решаться уровнем изоляции транзакции. Для этого вы можете исследовать уровень изоляции моментальных снимков в SQL Server 2005 +.

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

1 голос
/ 10 марта 2011

Я не уверен, что что-то встроено, поэтому я думаю, что вам придется сделать что-то сделанное на заказ ...

Это абсолютно гипотетично и прямо из головы, но:

  1. Возьмите SPID открываемого соединения и сохраните его в некоторой таблице temp
    с текстом обновления обращения.
  2. Используйте фоновый процесс (либо SSIS, либочто-то еще) для отслеживания временной таблицы и проверки того, что SPID все еще присутствует как открытое соединение.
  3. Если соединение умирает, тогда фоновый процесс может выполнить сохраненную команду возврата
  4. Если соединениезавершается правильно, тогда SPID может быть удален из временной таблицы, чтобы фоновый процесс больше не возвращал его при закрытии соединения.

Комментарии или улучшения приветствуются!

0 голосов
/ 10 марта 2011

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

Подход, который я выбрал бы, заключается в том, чтобы запустить процесс на другом компьютере, который периодически отправляет эхо-запрос первому, чтобы проверить, все ли он в сети, а затем предпринимает действия, если он становится недоступным.

...