Si no tiene acceso a v$session, puede usar
select dbms_transaction.local_transaction_id from dual;
Esto solo funciona dentro de la sesión, pero no necesita privilegios v$. Si devuelve un valor no nulo, ha iniciado una transacción. Eso normalmente significa cambios no confirmados, pero hay excepciones. Si emitió un punto de guardado, cambió los datos y retrocedió al punto de guardado, la transacción todavía 'vive'. Además, el uso de enlaces de bases de datos inicia transacciones, incluso solo para selecciones (o solían hacerlo).