Depuis la documentation (pour SQL Server compact, mais toujours pertinent) :
Dans le premier exemple, vous ouvrez une connexion dans une portée de transaction. Dans le 2e, vous ne vous enrôlez pas.
Essayez d'ajouter :
cmd.Connection.EnlistTransaction(Transaction.Current);
Pour voir si cela aide.