How to use internal transactions in clr code (I'm using c#) with context connection (my expirience):
1. Start the global transaction somewhere in the begining: SqlTransaction clrTransaction = connection.BeginTransaction()
2. Begin your local named transaction with clrTransaction.Save("mytran"); Use your own transaction name instead of "mytran".
3. If something wrong, rollback it with clrTransaction.Rollback("mytran") or Commit("mytran") if all ok;
4. At the end of you procedure make clrTransaction.Commit();
You can't use Transaction.Current if BEGIN TRANSACTION statement does not exists in t-sql code before calling your clr procedure
Transaction.Current does NOT support Save(), so you can only rollback everything that was made from the last t-sql BEGIN TRANSACTION.
In other words you cant make nested transactions with Transaction.Current.
If you try to make Transaction.Current.Rollback() as in expamples above, you will get [Transaction is not allowed to roll back inside a user defined routine...] rigth ater Rollback() or [The context transaction which was active before entering user defined routine..] after exiting from except block.
And of course server will show an error that transactions count in yours clr sp changed, then will make rollback.