Странная проблема SQL2005.«SqlConnection не поддерживает параллельные транзакции»
-
03-07-2019 - |
Вопрос
У меня проблема, которая кажется результатом тупиковой ситуации.Сейчас мы ищем корень проблемы, но тем временем мы хотели перезапустить сервер и заставить клиента работать.
И теперь каждый раз, когда мы запускаем программу, она просто говорит: «SqlConnection не поддерживает параллельные транзакции».Мы ничего не меняли в программе, ее компиляции и на сервере клиента, но после ситуации «возможного тупика» она снова хочет выйти в интернет.
У нас есть 7 клиентов (компьютеров), на которых запущена программа, каждый клиент общается с веб-сервисом на локальном сервере, а веб-сервис общается с sql-сервером (тот же компьютер, что и веб-сервер).
Мы перезапустили и sql-сервер, и iis-сервер, но не перезагрузили сервер из-за того, что на сервере работают другие важные службы, поэтому это последнее, что мы делаем.На вкладке управления мы не видим никаких блокировок или чего-то еще.
Итак, мой вопрос: почему ошибка «SqlConnection не поддерживает параллельные транзакции» появляется от одного раза к другому, ничего не меняя в программе, и она все еще существует между sql-restart.
Похоже, это происходит при первом запросе к базе данных, который программа делает при запуске.
Если вам нужна дополнительная информация, просто спросите.Я озадачен...
Больше информации:Я не думаю, что у меня есть «долгоиграющие» транзакции.Часто сценарий таков: у меня есть набор данных с 20–100 строками (ContractRows), и я делаю .Update для tableAdapter.Я также просматриваю эти 20-100 строк и для некоторых из них создаю рекламные sql-запросы (например, если арендованный продукт помечен как возвращенный, я создаю sql-запрос, чтобы пометить продукт как возвращенный в базе данных)
Итак, я делаю это очень упрощенно:
Create objTransactionObject
Create objtableadapter (objTransactionObject)
for each row in contractDS.contractrows
if row.isreturned then
strSQL &= "update product set instock=1 where prodid=" & row.productid & vbcrlf
End if
next
objtableadapter.update(contractDS)
objData.ExecuteQuery(strSQL, objTransactionObject)
if succsesfull
objtransactionobject.commit
else
objtransactionobject.rollback
end if
objTran.Dispose()
А затем я делаю фиксацию или откат в зависимости от того, прошло ли все хорошо или нет.
Редактировать:Ни один из ответов не решил проблему, но я буду благодарен вам за полезные советы по устранению неполадок.
Сообщение «SqlConnection не поддерживает параллельные транзакции» внезапно исчезло, и теперь sql-сервер просто «выходит из строя» 4-5 раз в день, я думаю, это тупик, из-за которого это происходит, но у меня нет необходимых знаний, чтобы это выяснить, и мне не хватает знаний на экспертов по sql, которые могут следить за этим для меня в данный момент.Я просто перезапускаю sql-сервер и все снова работает.1 из 10 раз мне также приходится перезагружать компьютер.Меня это очень беспокоит (и моих клиентов, конечно).
Любой, кто знает человека с хороший Если у вас есть знания по анализу проблем с взаимоблокировками или другими проблемами sql в Швеции (или во всем мире, говоря по-английски), свяжитесь со мной бесплатно.Я знаю, что это не контактный сайт, но я рискнул задать вопрос, потому что у меня закончились варианты. Я потратил 3 дня и ночи на оптимизацию клиентов, чтобы быть уверенным, что мы закрываем соединения и не делаем там слишком много глупостей. .Без удачи.
Решение
Похоже, что вы разделяете соединения и создаете новые транзакции в одном и том же открытом соединении (это параллельная часть исключения, которое вы видите).
Ваш пример, кажется, подтверждает это, поскольку вы не упоминаете, как вы получаете в нем соединение.
Вам следует просмотреть свой код и убедиться, что вы только открываете соединение, а затем удаляете его, когда закончите (и обязательно используйте оператор using, чтобы убедиться, что вы закрываете соединение), как кажется. как будто вы оставляете один где-то открытым.
Другие советы
Ваша проблема не выглядит чем-то необычным.Google обнаружил много совпадений, когда я вставил вашу строку ошибки в поле запроса.
Читая прошлые ответы, кажется, что это как-то связано с неправильным чередованием транзакций или уровнем изоляции.
Как долго соединения остаются открытыми?У вас есть длительные транзакции?
У вас есть неявные транзакции где-то включено, чтобы происходили какие-то транзакции там, где вы их не ожидали?Открывали ли вы Монитор активности, чтобы узнать, есть ли какие-либо неожиданные транзакции?
Вы пробовали сделать резервную копию журнала транзакций?Это тоже может прояснить ситуацию, если я правильно запомнил предыдущий подобный опыт.