How to check if the current connection is in a transaction?
A simple way is to compare now() to statement_timestamp().


now() gives the current date and time (start of current transaction).
statement_timestamp() gives the current date and time (start of current statement).


Example:

SELECT now() = statement_timestamp();
-- TRUE

BEGIN;
SELECT now() = statement_timestamp();
-- FALSE


The other alternative is to execute two queries:

SELECT txid_current();
SELECT txid_current();


and compare the resulting xid. If it is the same, then you are in a transaction.

The downside to the latter approach is that every txid_current() increments xid value and will further advance you to a wraparound.