Tente ver assim:
O comprimento da transação só é determinado quando você chama trans.Complete() ou sai do escopo da transação. Pegue o seguinte código:
using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}
Não há como lançar uma exceção de tempo limite enquanto estiver dentro da rotina de sono e não faria sentido se isso acontecesse. E assim, usar o tempo limite da transação (pelo menos desta forma) só pode garantir que, se a transação demorar mais do que o seu tempo limite, ela não será confirmada.
Se você estiver apenas executando uma consulta (para a qual eu não sei para que você usa as transações), poderá definir o tempo limite da consulta/comando (ou o que você chamar). IIRC, sua consulta retornará imediatamente após o tempo limite expirar.
Outra maneira seria definir o tempo limite da solicitação do serviço da Web e apenas supor que o serviço da Web está demorando muito para responder por causa do que quer que esteja dentro da sua transação.
EDIT:Você pode tentar:
- Gerar sua transação em um encadeamento diferente e esperar que ela seja concluída (usando Thread.Join(timeout)) em seu encadeamento principal (um usado pela chamada do webservice). Portanto, se ele não terminar antes do tempo limite especificado, você poderá parar de esperar e retornar um erro de tempo limite (não se esqueça de sinalizar ao outro thread para abortar a transação).
- Supondo que você esteja realizando apenas consultas SQL dentro dessas transações, você pode usar a palavra-chave "BEGIN TRANSACTION" para especificar a transação no script sql (hacky, de fato). Então você poderia apenas especificar o tempo limite do comando e executar tudo isso em uma única linha de código. Mas isso requer que você mova tudo o que faz dentro da transação para um script sql que pode ou não ser possível para você... e não está limpo.