Опитайте се да погледнете на това по следния начин:
Дължината на транзакцията се определя само когато извикате trans.Complete() или излезете от обхвата на транзакцията. Вземете следния код:
using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}
Няма начин да хвърлите изключение за изчакване, докато сте в рутината за заспиване и няма да има смисъл, ако го направи. И така използването на изчакване на транзакция (поне по този начин) може да гарантира само, че ако транзакцията отнеме повече време от вашето изчакване, тя няма да бъде ангажирана.
Ако просто изпълнявате една заявка (за която няма да знам за какво използвате транзакциите), тогава можете да зададете времето за изчакване на заявката/командата (или както го наричате). IIRC, вашата заявка ще се върне веднага след изтичане на времето за изчакване.
Друг начин би бил да зададете време за изчакване на вашата заявка за уеб услуга и просто да приемете, че уеб услугата отнема твърде много време, за да отговори, поради каквото и да е във вашата транзакция.
РЕДАКТИРАНЕ:Можете да опитате:
- Създаване на вашата транзакция в различна нишка и след това изчакване тя да завърши (използване на Thread.Join(timeout)) на вашата основна нишка (използвана от извикването на уеб услугата). Така че, ако не приключи преди времето за изчакване, което сте посочили, можете да спрете да чакате и да върнете грешка при изчакване (не забравяйте да сигнализирате на другата нишка да прекрати транзакцията).
- Ако приемем, че изпълнявате само SQL заявки в тези транзакции, можете да използвате ключовата дума „НАЧАЛО НА ТРАНЗАКЦИЯ“, за да посочите транзакцията в sql скрипта (наистина хакерско). След това можете просто да посочите времето за изчакване на командата и да изпълните всичко това в един ред код. Но тогава това изисква да преместите всичко, което правите вътре в транзакцията, в sql скрипт, което може или не може да е възможно за вас... и не е чисто.