In your situation row A should roll back, are you stepping through the service to see the roll back because if you do then every transaction is on its own i.e. every transaction will auto commit before it moves to next step, this is because when you step through the service you actually call each step sepeartely.
Are you using Exit with signal failure in your catch block i.e. after the error occurs in row B it should go to Catch block, where at the end you are supposed to use Exit with Signal failure for auto rollback.
I took another look at my try and catch, by setting the exit from $flow, I can stop row A going in. But if i’m calling my test flow from a parent flow, row A is still committed !!. This is how i would have to call the flows.
The dynamic insert statements are very simple, i was investigating whether i could apply implicit transaction control to some legacy flows, to stop partial data being applied. I am trying to minimise changes required.
And i guess that implicit transactions are not the way to go, the documentation in this subject is rather poor.
If your parent/top-level service has a try-catch block, you will need to rethrow the exception from within the catch block. The implicit transaction is associated with the top-level service. Therefore, if that service completes without an error, then the transaction is assumed to have succeeded.