index 20530d75d712da6748c1af05fbf6e0bac51b3fb4..b66f42e7ebc9559c7cd69e3d374e4c997bfbcdb6 100644 (file)
<!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/lock.sgml,v 1.26 2001年08月04日 22:01:38 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/lock.sgml,v 1.27 2001年08月10日 14:30:14 momjian Exp $
Postgres documentation
-->
LOCK
</refname>
<refpurpose>
- Explicitly lock a table inside a transaction
+ Explicitly lock a table / tables inside a transaction
</refpurpose>
</refnamediv>
<refsynopsisdiv>
<date>2001年07月09日</date>
</refsynopsisdivinfo>
<synopsis>
-LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable>
-LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN <replaceable class="PARAMETER">lockmode</replaceable> MODE
+LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> [, ...]
+LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> [, ...] IN <replaceable class="PARAMETER">lockmode</replaceable> MODE
where <replaceable class="PARAMETER">lockmode</replaceable> is one of:
@@ -373,6 +373,7 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
An example for this rule was given previously when discussing the
use of SHARE ROW EXCLUSIVE mode rather than SHARE mode.
</para>
+
</listitem>
</itemizedlist>
@@ -383,6 +384,12 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
</para>
</note>
+ <para>
+ When locking multiple tables, the command LOCK a, b; is equivalent to LOCK
+ a; LOCK b;. The tables are locked one-by-one in the order specified in the
+ <command>LOCK</command> command.
+ </para>
+
<refsect2 id="R2-SQL-LOCK-3">
<refsect2info>
<date>1999年06月08日</date>
@@ -406,6 +413,7 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
<para>
<command>LOCK</command> works only inside transactions.
</para>
+
</refsect2>
</refsect1>
index 37814cdcd3841b2d577df6b65d3c7afc71b69933..3d02fdb5fd2f34b5b339a111f55985c8578fae83 100644 (file)
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.138 2001年08月04日 22:01:38 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.139 2001年08月10日 14:30:14 momjian Exp $
*
* NOTES
* The PerformAddAttribute() code, like most of the relation
MAXALIGN(data_length);
return (tuple_length > TOAST_TUPLE_THRESHOLD);
}
-
-
+
/*
*
* LOCK TABLE
void
LockTableCommand(LockStmt *lockstmt)
{
- Relation rel;
- int aclresult;
-
- rel = heap_openr(lockstmt->relname, NoLock);
-
- if (rel->rd_rel->relkind != RELKIND_RELATION)
- elog(ERROR, "LOCK TABLE: %s is not a table", lockstmt->relname);
-
- if (lockstmt->mode == AccessShareLock)
- aclresult = pg_aclcheck(lockstmt->relname, GetUserId(), ACL_SELECT);
- else
- aclresult = pg_aclcheck(lockstmt->relname, GetUserId(),
- ACL_UPDATE | ACL_DELETE);
+ List *p;
+ Relation rel;
+
+ /* Iterate over the list and open, lock, and close the relations
+ one at a time
+ */
- if (aclresult != ACLCHECK_OK)
- elog(ERROR, "LOCK TABLE: permission denied");
+ foreach(p, lockstmt->rellist)
+ {
+ char* relname = strVal(lfirst(p));
+ int aclresult;
+
+ rel = heap_openr(relname, NoLock);
+
+ if (rel->rd_rel->relkind != RELKIND_RELATION)
+ elog(ERROR, "LOCK TABLE: %s is not a table",
+ relname);
+
+ if (lockstmt->mode == AccessShareLock)
+ aclresult = pg_aclcheck(relname, GetUserId(),
+ ACL_SELECT);
+ else
+ aclresult = pg_aclcheck(relname, GetUserId(),
+ ACL_UPDATE | ACL_DELETE);
- LockRelation(rel, lockstmt->mode);
+ if (aclresult != ACLCHECK_OK)
+ elog(ERROR, "LOCK TABLE: permission denied");
- heap_close(rel, NoLock); /* close rel, keep lock */
+ LockRelation(rel, lockstmt->mode);
+
+ heap_close(rel, NoLock); /* close rel, keep lock */
+ }
}
index 0d9aef03edff98efa5be45078eb98041ad80859b..ddb5822cde2cd903e3e4a85073e4eb59162017ea 100644 (file)
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.150 2001年08月04日 22:01:38 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.151 2001年08月10日 14:30:14 momjian Exp $
*
*-------------------------------------------------------------------------
*/
{
LockStmt *newnode = makeNode(LockStmt);
- if (from->relname)
- newnode->relname = pstrdup(from->relname);
+ Node_Copy(from, newnode, rellist);
+
newnode->mode = from->mode;
return newnode;
index 74a88555c5d3f5f5ab635345a81d7b0d32640328..06cdeef9ad8ed4380ac8424ee37bf24fd4d84916 100644 (file)
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.98 2001年08月04日 22:01:38 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.99 2001年08月10日 14:30:14 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1283,7 +1283,7 @@ _equalDropUserStmt(DropUserStmt *a, DropUserStmt *b)
static bool
_equalLockStmt(LockStmt *a, LockStmt *b)
{
- if (!equalstr(a->relname, b->relname))
+ if (!equal(a->rellist, b->rellist))
return false;
if (a->mode != b->mode)
return false;
index 96690aa90cf0c57329a3d57deb72778511d9baca..2a08413dafe91920be0cce7346b45aafd51ac740 100644 (file)
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.241 2001年08月06日 05:42:48 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.242 2001年08月10日 14:30:14 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
}
;
-LockStmt: LOCK_P opt_table relation_name opt_lock
+LockStmt: LOCK_P opt_table relation_name_list opt_lock
{
LockStmt *n = makeNode(LockStmt);
- n->relname = 3ドル;
+ n->rellist = 3ドル;
n->mode = 4ドル;
$$ = (Node *)n;
}
index ad7bcc2e0f3b9872465edfa5a00576ae4ee30d0d..704b8cab4a734ae59e3c8eaa5dadff2f23d6d804 100644 (file)
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: parsenodes.h,v 1.138 2001年08月04日 22:01:39 momjian Exp $
+ * $Id: parsenodes.h,v 1.139 2001年08月10日 14:30:15 momjian Exp $
*
*-------------------------------------------------------------------------
*/
typedef struct LockStmt
{
NodeTag type;
- char *relname; /* relation to lock */
+ List *rellist; /* relations to lock */
int mode; /* lock mode */
} LockStmt;
index 88330ad3c1de5a9d5af76a53b01ed43e8ca6f059..09180f85c9c28b38ae68378f4f0e392a08295277 100644 (file)
@@ -2421,7 +2421,7 @@ DeleteStmt: DELETE FROM relation_expr where_clause
}
;
-LockStmt: LOCK_P opt_table relation_name opt_lock
+LockStmt: LOCK_P opt_table relation_name_list opt_lock
{
$$ = cat_str(4, make_str("lock"), 2,ドル 3,ドル 4ドル);
}