Хранимые процедуры, запрограммированные на запуск отдельных последовательных транзакций, выполняются одновременно - PullRequest
0 голосов
/ 20 сентября 2010

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

Возможно ли, что sql сообщит, что выполнение завершено до того, как оно действительно будет?Может ли блокировка сохраняться для завершенной транзакции?Есть ли что-то еще, что я должен искать, чтобы понять, что происходит?

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

Ответы [ 3 ]

0 голосов
/ 20 сентября 2010

Обычно это происходит, когда вы не Dispose задействовали все одноразовые предметы, такие как Transaction с и Connection с.

0 голосов
/ 20 сентября 2010

Что именно вы подразумеваете под «последовательными транзакциями»? Две транзакции, выполняющиеся последовательно, или две транзакции, выполняемые с уровнем изоляции сериализации? Ваша программа на C # гарантированно будет выполнять только один рабочий процесс за раз, или есть какой-либо параллелизм между двумя экземплярами программы (обычно в ASP.Net, WCF, WF и многих других сценариях с размещенным кодом) )

Другой распространенной ошибкой может быть то, что у вас есть незавершенные шаги в рабочем процессе. Скажем, Step1 запускает транзакцию в ConnecitonA, а затем завершает без фиксации. Когда логика переходит к шагу 2, выполняет новую транзакцию в ConnectionB, она вполне может конфликтовать и блокироваться с незавершенной работой, оставшейся от шага 1. Это будет фактический параллелизм на уровне базы данных после полного сериализованного выполнения на клиенте.

Возможно ли, что sql сообщит что выполнение завершено, до того на самом деле?

нет

Нет

Может ли замок сохраняться через завершена транзакция?

Нет (по всем практическим причинам блокировки области сеанса применяются только к блокировкам или блокировкам использования базы данных).

Есть что-нибудь еще, что я должен посмотреть чтобы понять, что происходит?

На сервере будет достаточно средств для устранения неполадок. Между Профилировщиком, информацией о графике тупиков, sys.dm_exec_requests и sys.dm_tran_locks, вся необходимая информация находится здесь.

0 голосов
/ 20 сентября 2010

Вы уверены, что перед последними шагами выдается COMMIT или ROLLBACK? Сервер Sql сообщит о завершении для любого пакета запроса, но конец пакета запроса не обязательно означает, что транзакция завершилась, если только этот пакет не выдал COMMIT или ROLLBACK.

Все блокировки должны быть сняты в конце транзакции, но помните, что транзакции могут быть вложенными (http://msdn.microsoft.com/en-us/library/ms189336%28v=SQL.90%29.aspx)

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

Редактировать : вы также можете проверить эту ссылку: http://msdn.microsoft.com/en-us/library/ms178104%28v=SQL.90%29.aspx, в которой приведены некоторые примеры и информация о том, как определить причину тупика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...