ExclusiveLock rather than AccessExclusiveLock. This will allow concurrent
SELECT queries to proceed on the table. Per discussion with Andrew at
SuperNews.
index 1aeec22b66cf43a24755f861d0827a42bfc03838..5982c22bd3339f74227c5edd6d841cfa2e3d01ca 100644 (file)
<!--
-$PostgreSQL: pgsql/doc/src/sgml/mvcc.sgml,v 2.47 2005年02月26日 18:37:17 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/mvcc.sgml,v 2.48 2005年03月23日 07:44:56 neilc Exp $
-->
<chapter id="mvcc">
@@ -677,9 +677,10 @@ SELECT SUM(value) FROM mytab WHERE class = 2;
</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.
+ Acquired by <command>CREATE TRIGGER</command> and
+ <command>ALTER TABLE ADD FOREIGN KEY</command>. This lock
+ mode can also be acquired on certain system catalogs in some
+ operations.
</para>
</listitem>
</varlistentry>
index 0b11976db848aa9ffd067847c8e5439f8245ca92..1a6c1f82625e0230ab56d01f841ada6472aa8c48 100644 (file)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.148 2005年03月20日 22:00:52 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.149 2005年03月23日 07:44:57 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -3829,13 +3829,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
Oid constrOid;
/*
- * Grab an exclusive lock on the pk table, so that someone doesn't
- * delete rows out from under us. (Although a lesser lock would do for
- * that purpose, we'll need exclusive lock anyway to add triggers to
- * the pk table; trying to start with a lesser lock will just create a
- * risk of deadlock.)
+ * Grab a lock on the pk table, so that someone doesn't delete
+ * rows out from under us. We will eventually need to add triggers
+ * to the table, at which point we'll need to an ExclusiveLock --
+ * therefore we grab an ExclusiveLock now to prevent possible
+ * deadlock.
*/
- pkrel = heap_openrv(fkconstraint->pktable, AccessExclusiveLock);
+ pkrel = heap_openrv(fkconstraint->pktable, ExclusiveLock);
/*
* Validity and permissions checks
index fd7d9afb836f59ea94d30b32b65cb3c3e9a38d37..55333e1f4f108f5414fba3d3d1885aa52fccdafa 100644 (file)
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.178 2005年03月20日 23:40:24 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.179 2005年03月23日 07:44:57 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -87,7 +87,14 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
ObjectAddress myself,
referenced;
- rel = heap_openrv(stmt->relation, AccessExclusiveLock);
+ /*
+ * We need to prevent concurrent CREATE TRIGGER commands, as well
+ * as concurrent table modifications (INSERT, DELETE, UPDATE), so
+ * acquire an ExclusiveLock -- it should be fine to allow SELECTs
+ * to proceed. We could perhaps acquire ShareRowExclusiveLock, but
+ * there seems little gain in allowing SELECT FOR UPDATE.
+ */
+ rel = heap_openrv(stmt->relation, ExclusiveLock);
if (stmt->constrrel != NULL)
constrrelid = RangeVarGetRelid(stmt->constrrel, false);