Странность тайм-аута TransactionScope с TransactionScopeOption.RequiresNew - PullRequest
3 голосов
/ 27 апреля 2009

Здесь происходит нечто сверхъестественное.

Я только что добавил область транзакции вокруг некоторого устаревшего кода, который я отлаживал, чтобы гарантировать, что суета, которую я делал, не будет зафиксирована.

Это сработало дважды, затем сказал:

"The transaction manager has disabled its support for remote/network transactions."

без каких-либо изменений кода или перестройки между рабочим / нерабочим режимом (буквально 3 F5 подряд [веб-приложение]). Это был локальный код подключения к серверу удаления БД.

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

Что, черт возьми, происходит?

Редактировать: я обнаружил, что изменяя мои TransactionScopes с:

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))

до

using (var scope = new TransactionScope())

предотвращает проблему: s

Что это значит?

Ответы [ 3 ]

3 голосов
/ 03 сентября 2009

Разница между:

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))

и

using (var scope = new TransactionScope())

Является ли второй повторным использованием существующей (внешней) транзакции, тогда как первая создает новую транзакцию в старой.

Эта транзакция в транзакции требует координатора распределенных транзакций.

Существует три вероятных причины вашей ошибки:

  • MSDTC не работает
  • Ваша база данных находится на другом компьютере, и окна настроены так, чтобы не разрешать транзакции из сети.
  • Ваша база данных находится на другом компьютере, а сервер SQL настроен на запрет транзакций из сети
0 голосов
/ 01 июня 2015

Старый вопрос, но у меня была та же проблема, так что здесь простая информация, чтобы исправить многие виды проблем.

Если вы можете изменить значение с TransactionScopeOption.RequiresNew на TransactionScopeOption.Required , проверьте, действительно ли вам нужно явное поведение для вложенных транзакций и рассмотрите возможность явного задания типа области транзакции, прочитав эту статью MSDN . Возможно, ваша проблема заключалась в количестве новых транзакций с заблокированными ресурсами, поэтому проблема была «странной».

Дополнительно вы должны проверить эту информацию:

Область транзакции по умолчанию считается вредоносной

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))

по умолчанию вы устанавливаете:

  1. IsolationLevel как Serializable (рассмотрите возможность использования IsolationLevel.ReadCommitted)
  2. TimeOut до одной минуты (рассмотрите возможность использования TransactionManager.MaximumTimeout)

С этими двумя вариантами и TransactionScopeOption.RequiresNew вы должны ожидать взаимных блокировок.

Вот новый код:

new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions 
    {
        IsolationLevel = IsolationLevel.ReadCommitted,
        Timeout = TransactionManager.MaximumTimeout
    }
)
0 голосов
/ 27 апреля 2009

Я полагаю, что то, что происходит при возникновении ошибки, заключается в том, что платформа пытается преобразовать исходную «облегченную» (т.е. СУБД) транзакцию в «распределенную» транзакцию. Служба MSDTC (координатор распределенных транзакций), которая управляет распределенными транзакциями, либо не работает, либо не может работать.

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

...