Last year, I questioned why CREATE TRIGGER acquires an AccessExclusiveLock on its target table:
http://archives.postgresql.org/pgsql-hackers/2005-03/msg00764.php Acquiring an ExclusiveLock should be sufficient: we can safely allow concurrent SELECTs on the table. (The -hackers thread discusses both CREATE TRIGGER and ALTER TABLE ADD FK; the latter might require some more consideration, so I'll tackle that later.) This patch implements this change, and updates the documentation. Barring any objections, I'll apply this in a day or two. -Neil
Index: doc/src/sgml/mvcc.sgml =================================================================== RCS file: /projects/cvsroot/pgsql/doc/src/sgml/mvcc.sgml,v retrieving revision 2.56 diff -c -r2.56 mvcc.sgml *** doc/src/sgml/mvcc.sgml 23 Apr 2006 03:39:52 -0000 2.56 --- doc/src/sgml/mvcc.sgml 4 Jul 2006 06:21:07 -0000 *************** *** 683,691 **** </para> <para> ! This lock mode is not automatically acquired on user tables by any ! <productname>PostgreSQL</productname> command. However it is ! acquired on certain system catalogs in some operations. </para> </listitem> </varlistentry> --- 683,691 ---- </para> <para> ! Acquired by <command>CREATE TRIGGER</>. This lock mode is also ! acquired by <productname>PostgreSQL</> on certain system catalogs in ! some operations. </para> </listitem> </varlistentry> Index: src/backend/commands/trigger.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/commands/trigger.c,v retrieving revision 1.203 diff -c -r1.203 trigger.c *** src/backend/commands/trigger.c 16 Jun 2006 20:23:44 -0000 1.203 --- src/backend/commands/trigger.c 4 Jul 2006 06:21:13 -0000 *************** *** 92,98 **** ObjectAddress myself, referenced; ! rel = heap_openrv(stmt->relation, AccessExclusiveLock); if (stmt->constrrel != NULL) constrrelid = RangeVarGetRelid(stmt->constrrel, false); --- 92,102 ---- ObjectAddress myself, referenced; ! /* ! * Make sure we block concurrent data-modifying commands and DDL, but we ! * can safely allow SELECTs. ! */ ! rel = heap_openrv(stmt->relation, ExclusiveLock); if (stmt->constrrel != NULL) constrrelid = RangeVarGetRelid(stmt->constrrel, false);
---------------------------(end of broadcast)--------------------------- TIP 2: Don't 'kill -9' the postmaster