Perhaps the "end" is one , since you are BEGIN and COMMIT only once, and this is one transaction with its own scope. This is simpler in terms of concurrency: basically the transaction says: this is my table now, do not touch anyone.
If you execute several times (two other solutions), you BEGIN and COMMIT transaction many times (after you have completed the transaction, the next transaction has started). This means more chances to interrupt from other current database operations. Also - these operations take time themselves.
However, you must run a test that mimics your use case. I would be interested to know whether it depends on certain conditions (the number of rows to insert, session configuration, data type, indexes used), one or another solution may prevail.
source share