Проблемы с вложенными транзакциями в пользовательской службе Windows - PullRequest
0 голосов
/ 23 апреля 2010

У меня есть пользовательская служба Windows, которую я недавно обновил, чтобы использовать TransactionScope для вложенных транзакций.Он отлично работал локально на моей старой машине dev (XP sp3) и на тестовом сервере (Server 2003).Однако, это терпит неудачу на моей новой машине Windows 7 так же как на 2008 Server.Он был ориентирован на 2.0 фреймворк;Вместо этого я попытался настроить таргетинг на 3.5, но он все равно не сработал.

Странная часть в том, как это происходит;исключение не выбрасывается.Сам сервис просто время ожидания.Я добавил код трассировки, и он не работает при открытии соединения для базы данных # 2 ниже.Я также включил трассировку для System.Transactions;он буквально обрывается во время записи блока для неудачного соединения.

Мы запустили трассировку SQL, но отображается только первый поиск.Я вставил следы кода, и он доходит до строки до второго поиска, но ничего после.У меня был один и тот же опыт работы с двумя разными SQL-серверами (оба SQL 2005 работают на Server 2003).Строка подключения использует учетную запись SQL (не интеграция с Windows).В этом случае все соединения относятся к одной и той же базе данных, но, учитывая характер кода, он переходит в MSDTC.

Вот базовая структура кода:

TransactionOptions options = new TransactionOptions();
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, options))
{
 // Database lookup #1

 TransactionOptions options = new TransactionOptions();
 options.IsolationLevel = Transaction.Current != null ? Transaction.Current.IsolationLevel : System.Transactions.IsolationLevel.ReadCommitted;
 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
 {
  // Database lookup #2; fails on connection.Open()
  // Database save (never reached)
  scope.Complete();<br/>
 }
 scope.Complete();<br/>
}

Мой локальный брандмауэротключен.Служба обычно работает с использованием сетевой службы, но я также попробовал свою учетную запись пользователя (те же результаты).

Суть в том, что я широко использую одну и ту же общую технику в своих веб-приложениях и у меня не было проблем,Я вытащил код и запустил его в локальном приложении Windows Form.Если у кого-нибудь есть какие-либо дополнительные идеи по отладке (или, что еще лучше, решения), я бы хотел их услышать.

1 Ответ

0 голосов
/ 19 мая 2010

Окружите ваши поиски в базе данных новой транзакцией и используйте опцию подавления. Select блокирует записи в sql2005 даже с подсказкой nolock.

...