Most likely you need to add:
cmd.Transaction = tran;
is not specified as part of the transaction, then the runtime will not recognize its inclusion, as stated in
For details see the documentation.
In my comment, I suggest looking into the Autocommit property of the connection.
As Oracle’s documentation states
The current transaction’s Commit call after executing each SQL statement is determined by this property. If not, it defaults to false, while the default value is true.
So at least try