Most client languages, include those supported by .NET allow you to manage transactions. To do this, you need to remove any commit/rollback control from the procedure.
The client language will need to issue a "begin transaction" before calling the procedure, then a commit or rollback depending on the return status of the procedure. In the even of a failure, rollback should be issued.
I'm not a .NET guy so I can't give you actual code syntax, but I guess this should be obvious to your developers.