тайм-аут во вложенной транзакции - PullRequest
3 голосов
/ 11 марта 2012

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

void RootMethod()
{   
   //default timeout is 60 seconds 
   using(TransactionScope scope = new TransactionScope())
   {
      /* Perform transactional work here */
      SomeMethod();
      scope.Complete();
   }
}

void SomeMethod()
{   
   //set timeout to 30 seconds
   TimeSpan timeout = TimeSpan.FromSeconds(30);
   using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, timeout))
   {
      /* Perform transactional work here */
      scope.Complete();
   }
}

Состояния MSDN - Во вложенной иерархии TransactionScope тайм-аут представляет собой объединение всех тайм-аутов.По сути, наименьший тайм-аут из всех областей в иерархии имеет приоритет.

В первом утверждении указано объединение всех тайм-аутов, но во втором утверждении указано, что он наименьший из всех областей.Правильно ли я понимаю, что приведенный выше код с вложенной областью имеет время ожидания по умолчанию 30 секунд, а не 90?

1 Ответ

2 голосов
/ 11 марта 2012

Это точно не будет 90 секунд;это сумма , а не союз.Объединение «сейчас до 30 секунд» и «не раньше 60 секунд» - это просто «сейчас до 60 секунд».Конечно, это должно быть довольно просто проверить, сознательно блокируя себя.Я подозреваю это означает «пересечение всех тайм-аутов», в этом случае значение имеет 30 секунд;потому что: только самая внешняя транзакция имеет право на фиксацию - но любая транзакция в улье может обречь всю транзакцию (откат на любом уровне откатит всю внешнюю транзакцию)

...