Isso provavelmente não é um problema com seu código. É um bug no SQL Server. Eles tiveram um problema semelhante no SQL Server 2005. Isso só aconteceu em condições que estavam certas, então poucas pessoas viram e as que viram ficaram muito confusas.
Dito isto, aqui estão algumas coisas para verificar que funcionaram para outras pessoas com o mesmo problema:
- Procure por DataReaders que não estejam fechados. Certifique-se de estar fazendo myReader.Close() depois de ler as linhas desejadas. Muitas pessoas simplesmente dançam sem fechar.
- Use a classe SqlTransaction nativa em vez de OleDbTransactions sempre que possível.
- Veja suas transações. Certifique-se de confirmar/reverter de forma limpa antes de fechar sua conexão.
- Use Connection.BeginTransation em vez de Connection.BeginDbTransaction