The transaction IDs of currently executing transactions are shown in
   pg_locks
   in columns virtualxid and
   transactionid.  Read-only transactions
   will have virtualxids but NULL
   transactionids, while both columns will be
   set in read-write transactions.
  
   Some lock types wait on virtualxid,
   while other types wait on transactionid.
   Row-level read and write locks are recorded directly in the locked
   rows and can be inspected using the pgrowlocks
   extension.  Row-level read locks might also require the assignment
   of multixact IDs (mxid;  see Section 24.1.5.1).