У меня есть несколько клиентов, подключающихся к SQL Server по ненадежной (беспроводной / gprs) сети и выполняющих большое количество небольших запросов и операций вставки в течение нескольких минут. Если во время процесса разрывается сетевое соединение, вся транзакция откатывается и требует перезапуска. Из-за требований бизнеса, процесс должен быть транзакционным (то есть другие клиенты видят либо полный набор данных от других клиентов, либо не видят его вообще).
Я хотел бы иметь возможность обнаруживать разрыв соединения и иметь возможность повторно подключиться к SQL Server и продолжить процесс в той же транзакции , которая только что была прервана, и избежать перезапуска с самого начала. В данный момент я использую sp_getbindtoken
сразу после открытия соединения, задаю CommandTimeout
небольшое значение (намного меньшее, чем TCP KeepAlive), и если я получаю таймаут во время ExecuteNonQuery
, я открываю новое соединение с сервером и вызываю sp_bindsession
с токеном с самого начала процесса. Затем я продолжаю процесс, используя новое соединение с сеансом, привязанным к транзакции предыдущего процесса.
Пока он работает почти идеально, но, согласно MSDN , этот API устарел и будет удален в будущих версиях SQL Server. Вопрос в том, как мне достичь тех же результатов без этих двух команд? Есть ли другой способ возобновить транзакцию с разорванного TCP-соединения?
Редактировать / дополнительная информация: Клиентское приложение работает на устройствах Windows CE со сканерами штрих-кода. Я предоставляю как устройства, так и программное обеспечение, поэтому я могу разместить там все, что мне нужно. БД размещается в защищенной среде третьей стороной, и ни я, ни клиент не могут ее контролировать. У меня есть около 50 МБ ежедневных данных о продажах для отправки. Я могу использовать SP для сохранения данных, но он все равно должен быть передан, и один вызов SP с одним большим аргументом имеет почти 0% шанс успеха по каналу GPRS / EDGE.
Поскольку все решение работает в производственной среде, я бы хотел, чтобы изменения были минимальными. Альтернативный API с такой же семантикой, как у sp_bindsession
, был бы идеальным.