See the question and my original answer on StackOverflow

It looks like a bug, as it's .NET internal code, nothing do do with your own code.

If you take a look with reflector (or any other IL tool) on the internal TransactedConnectionPool.TransactionEnded method, you will see its implementation has changed between .NET 3 and .NET 4... I suppose it was not thread-safe back then. You could try to report it to Microsoft Connect.