Advantage of using aacept_tr and begin_tr

Usually we write UVM driver code like below

seq_item_port.get_next_item(req);
      
// Drive the item
drive(req);
 
// Indicate to the sequencer that the item is done
seq_item_port.item_done(req);
`uvm_info(get_type_name(), req.convert2string(), UVM_FULL);

What advantage UVM will provide if we use accept_tr and begin_tr while driving

In reply to bachan21:

There is no benefit using begin_tr and accept_tr.
But it adds specific functionality to it.
See the UVM reference Manual for details:
begin_tr: This function marks the start of a transaction, tr, by this component. Specifically, it performs the following actions:

Calls tr’s uvm_transaction::begin_tr method, passing to it the begin_time argument. The begin_time should be greater than or equal to the accept time. By default, when begin_time = 0, the current simulation time is used.
accept_tr: This function marks the acceptance of a transaction, tr, by this component. Specifically, it performs the following actions:

Calls the tr’s uvm_transaction::accept_tr method, passing to it the accept_time argument.
Calls this component’s do_accept_tr method to allow for any post-begin action in derived classes.
Triggers the component’s internal accept_tr event. Any processes waiting on this event will resume in the next delta cycle.