But the second thing to say is to question why this situation might arise in the first place.

I’m not going to argue in favour of it but having seen it a couple of times recently, this is just an observation that if you are doing this then the different methods are not equal.

A more valid question might be which of these concurrent transactions is the one which should be persisted?
(the premise is that this is data with a key which may or may not exist, the attributes of the entity might be the same, might be different)

And if it doesn’t matter (how can it not matter?) then why not use the MERGE for ease of code and just discard the dup_val_on_index exception should it arise.