I suggest a hybrid method.
Do something like the first method except that you begin new transactions only at certain record counts, for example, every 2000 values processed:
record #1; record #2001; record #4001; etc.
You can adjust the number up or down as needed to reduce locking.
Every one in a separate transaction is huge overhead in creating and committing trans.
All in one transaction is huge overhead if it has to rollback after doing a lot of inserts/updates.
SQL DBA,SQL Server MVP(07, 08, 09) Prosecutor James Blackburn, in closing argument in the Fatal Vision murders trial:
If in the future, you should cry a tear, cry one for them [the murder victims]. If in the future, you should say a prayer, say one for them. And if in the future, you should light a candle, light one for them.