If you place the transaction boundaries before update1 and after update 3,
you should be able to catch the exception at update 2 and keep trying update2 until it succeeds. The transaction will not fail if you code the exception handling properly. Code something like after three tries and it still had not succeeded, then abort the transaction and rollback whatever update1 did.