If you don't have access to v$session you can use
select dbms_transaction.local_transaction_id from dual;
This only works from within the session but doesn't need v$ privileges.
If it returns a non-null, you have started a transaction. That normally means uncommitted changes, but there are exceptions. If you issued a savepoint, changed data and rolled back to the savepoint, the transaction still 'lives'. Also, using database links starts transactions, even just for selects (or they used to).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…