Home Explore Blog CI



postgresql

2nd chunk of `doc/src/sgml/pgrowlocks.sgml`
ba161d200a6bc107ef26302338ad4d35babcff424d313fda0000000100000ca7
 </thead>
    <tbody>

     <row>
      <entry><structfield>locked_row</structfield></entry>
      <entry><type>tid</type></entry>
      <entry>Tuple ID (TID) of locked row</entry>
     </row>
     <row>
      <entry><structfield>locker</structfield></entry>
      <entry><type>xid</type></entry>
      <entry>Transaction ID of locker, or multixact ID if
      multitransaction;  see <xref linkend="transaction-id"/></entry>
     </row>
     <row>
      <entry><structfield>multi</structfield></entry>
      <entry><type>boolean</type></entry>
      <entry>True if locker is a multitransaction</entry>
     </row>
     <row>
      <entry><structfield>xids</structfield></entry>
      <entry><type>xid[]</type></entry>
      <entry>Transaction IDs of lockers (more than one if multitransaction)</entry>
     </row>
     <row>
      <entry><structfield>modes</structfield></entry>
      <entry><type>text[]</type></entry>
      <entry>Lock mode of lockers (more than one if multitransaction),
       an array of <literal>For Key Share</literal>, <literal>For Share</literal>,
       <literal>For No Key Update</literal>, <literal>No Key Update</literal>,
       <literal>For Update</literal>, <literal>Update</literal>.</entry>
     </row>

     <row>
      <entry><structfield>pids</structfield></entry>
      <entry><type>integer[]</type></entry>
      <entry>Process IDs of locking backends (more than one if multitransaction)</entry>
     </row>

    </tbody>
   </tgroup>
  </table>

  <para>
   <function>pgrowlocks</function> takes <literal>AccessShareLock</literal> for the
   target table and reads each row one by one to collect the row locking
   information.  This is not very speedy for a large table.  Note that:
  </para>

  <orderedlist>
   <listitem>
    <para>
     If an <literal>ACCESS EXCLUSIVE</literal> lock is taken on the table,
     <function>pgrowlocks</function> will be blocked.
    </para>
   </listitem>
   <listitem>
    <para>
     <function>pgrowlocks</function> is not guaranteed to produce a
     self-consistent snapshot.  It is possible that a new row lock is taken,
     or an old lock is freed, during its execution.
    </para>
   </listitem>
  </orderedlist>

  <para>
   <function>pgrowlocks</function> does not show the contents of locked
   rows. If you want to take a look at the row contents at the same time, you
   could do something like this:

<programlisting>
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
  WHERE p.locked_row = a.ctid;
</programlisting>

   Be aware however that such a query will be very inefficient.
  </para>
 </sect2>

 <sect2 id="pgrowlocks-sample-output">
  <title>Sample Output</title>

  <screen>
=# SELECT * FROM pgrowlocks('t1');
 locked_row | locker | multi | xids  |     modes      |  pids
------------+--------+-------+-------+----------------+--------
 (0,1)      |    609 | f     | {609} | {"For Share"}  | {3161}
 (0,2)      |    609 | f     | {609} | {"For Share"}  | {3161}
 (0,3)      |    607 | f     | {607} | {"For Update"} | {3107}
 (0,4)      |    607 | f     | {607} | {"For Update"} | {3107}
(4 rows)
</screen>
 </sect2>

 <sect2 id="pgrowlocks-author">
  <title>Author</title>

  <para>
   Tatsuo Ishii
  </para>
 </sect2>

</sect1>

Title: pgrowlocks Output and Usage
Summary
The pgrowlocks function returns a set of records with details about each locked row, including the tuple ID, locker transaction ID, and lock mode, and can be used to monitor row-level locking information, although it may not produce a self-consistent snapshot and can be blocked by exclusive locks.