In PLSQL (autonomous transaction or otherwise) we can 'cheat' a little because the only time you get control back is at the conclusion of the call. Thus the only the time we need to ensure that the redo is in sync with the work done is at the conclusion of the call.
For example
SQL> create table t ( x int );
Table created.
SQL>
SQL> create or replace
2 procedure do_commit is
3 --pragma autonomous_transaction;
4 begin
5 insert into t values(1);
6 commit;
7 end;
8 /
Procedure created.
SQL> -- before value
SQL> @stat
Enter value for sid: my
Enter value for stat_prefix: redo synch writes
SID_STAT# NAME VALUE
---------- -------------------------------------------------------------------------------- ----------
407 redo synch writes 13
SQL>
SQL> begin
2 for i in 1 .. 10000 loop
3 insert into t values(1);
4 do_commit;
5 commit;
6 end loop;
7 end;
8 /
PL/SQL procedure successfully completed.
SQL> -- after value
SQL> @stat
Enter value for sid: my
Enter value for stat_prefix: redo synch writes
SID_STAT# NAME VALUE
---------- -------------------------------------------------------------------------------- ----------
407 redo synch writes 14
We did thousands of commits, but only 1 of them actually waited on LGWR to say "yup, you're good".
You'll see the same result if you comment in the pragma above