What do you mean by "times out." Are you getting a transaction timed out exception? If you are you are most likely creating a transaction dead lock. Dead locks are not the easy to debug, but the key is to look for two execution stacks that work on the same data but in a different order. The first one locks the data the second one needs but can never progress because the second transaction is holding the data for the first.
Thanks, with that information I was able to find the problem and it was a deadlock issue.