Commit f30c76ce authored by Neil Conway's avatar Neil Conway

Adjust CREATE TRIGGER and ALTER TABLE ... ADD FOREIGN KEY to acquire

ExclusiveLock rather than AccessExclusiveLock. This will allow concurrent
SELECT queries to proceed on the table. Per discussion with Andrew at
SuperNews.
parent ac323044
<!-- <!--
$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"> <chapter id="mvcc">
...@@ -677,9 +677,10 @@ SELECT SUM(value) FROM mytab WHERE class = 2; ...@@ -677,9 +677,10 @@ SELECT SUM(value) FROM mytab WHERE class = 2;
</para> </para>
<para> <para>
This lock mode is not automatically acquired on user tables by any Acquired by <command>CREATE TRIGGER</command> and
<productname>PostgreSQL</productname> command. However it is <command>ALTER TABLE ADD FOREIGN KEY</command>. This lock
acquired on certain system catalogs in some operations. mode can also be acquired on certain system catalogs in some
operations.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -3829,13 +3829,13 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
Oid constrOid; Oid constrOid;
/* /*
* Grab an exclusive lock on the pk table, so that someone doesn't * Grab a lock on the pk table, so that someone doesn't delete
* delete rows out from under us. (Although a lesser lock would do for * rows out from under us. We will eventually need to add triggers
* that purpose, we'll need exclusive lock anyway to add triggers to * to the table, at which point we'll need to an ExclusiveLock --
* the pk table; trying to start with a lesser lock will just create a * therefore we grab an ExclusiveLock now to prevent possible
* risk of deadlock.) * deadlock.
*/ */
pkrel = heap_openrv(fkconstraint->pktable, AccessExclusiveLock); pkrel = heap_openrv(fkconstraint->pktable, ExclusiveLock);
/* /*
* Validity and permissions checks * Validity and permissions checks
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * 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) ...@@ -87,7 +87,14 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
ObjectAddress myself, ObjectAddress myself,
referenced; 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) if (stmt->constrrel != NULL)
constrrelid = RangeVarGetRelid(stmt->constrrel, false); constrrelid = RangeVarGetRelid(stmt->constrrel, false);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment