In reply to Cmdr_Vimes:
It is unclear to me what you are explaining here and it is definitely a bad idea to change the write functions to tasks.
And I do not understand what kind of race conditions you have on the transaction level. Race conditions are limited to RTL or gate level.
Transactions have no timing they have only a determined order. You have to make sutre you do not loose any transaction and you do not change the order of your transactions. Using uvm_analysis_fifo helps you to meet these 2 requirements.