webnoob webnoob - 24 days ago 6
C# Question

Check if an existing transactionscope is active

I am using:

public class TransactionUtils
{
public static TransactionScope CreateTransactionScope()
{
var TransactionOptions = new TransactionOptions();
TransactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
TransactionOptions.Timeout = TimeSpan.MaxValue;
return new TransactionScope(TransactionScopeOption.Required, TransactionOptions);
}
}


to create all my transactions. The problem I am facing is when I nest 2
TransactionUtils.CreateTransactionScope()
I get an error:
Time-out interval must be less than 2^32-2. Parameter name: dueTm
. I am assuming this is because it's trying to attach the child transaction to the parent one and the combined timeouts are to large.

Is there a way to tell if a newly created transaction will be a nested one so I can avoid setting a timeout?

The alternative is to pass a parameter to
CreateTransactionScope()
so I can tell it that's it's nested and not set the timeout but I would rather find an automatic way of handling it.

Answer

There's a pretty simple answer:

System.Transactions.Transaction.Current != null

This works since Framework 2.0.

I'm not sure why the other answer goes to such depths to create IL that links to nonpublic fields.