Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4fe42df

Browse files
committed
Add SHARE UPDATE EXCLUSIVE lock mode, coming soon to a VACUUM near you.
Name chosen per pghackers discussion around 6/22/01.
1 parent8902f49 commit4fe42df

File tree

8 files changed

+143
-80
lines changed

8 files changed

+143
-80
lines changed

‎doc/src/sgml/mvcc.sgml

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!--
2-
$Header: /cvsroot/pgsql/doc/src/sgml/mvcc.sgml,v 2.15 2001/05/17 21:50:16 petere Exp $
2+
$Header: /cvsroot/pgsql/doc/src/sgml/mvcc.sgml,v 2.16 2001/07/09 22:18:33 tgl Exp $
33
-->
44

55
<chapter id="mvcc">
@@ -441,6 +441,25 @@ ERROR: Can't serialize access due to concurrent update
441441
</listitem>
442442
</varlistentry>
443443

444+
<varlistentry>
445+
<term>
446+
ShareUpdateExclusiveLock
447+
</term>
448+
<listitem>
449+
<para>
450+
Acquired by <command>VACUUM</command> (without <option>FULL</option>)
451+
and <command>LOCK TABLE</command> table
452+
for <option>IN SHARE UPDATE EXCLUSIVE MODE</option>
453+
statements.
454+
</para>
455+
456+
<para>
457+
Conflicts with ShareUpdateExclusiveLock, ShareLock,
458+
ShareRowExclusiveLock, ExclusiveLock and AccessExclusiveLock modes.
459+
</para>
460+
</listitem>
461+
</varlistentry>
462+
444463
<varlistentry>
445464
<term>
446465
ShareLock
@@ -454,7 +473,8 @@ ERROR: Can't serialize access due to concurrent update
454473
</para>
455474

456475
<para>
457-
Conflicts with RowExclusiveLock, ShareRowExclusiveLock,
476+
Conflicts with RowExclusiveLock, ShareUpdateExclusiveLock,
477+
ShareRowExclusiveLock,
458478
ExclusiveLock and AccessExclusiveLock modes.
459479
</para>
460480
</listitem>
@@ -471,7 +491,8 @@ ERROR: Can't serialize access due to concurrent update
471491
</para>
472492

473493
<para>
474-
Conflicts with RowExclusiveLock, ShareLock, ShareRowExclusiveLock,
494+
Conflicts with RowExclusiveLock, ShareUpdateExclusiveLock,
495+
ShareLock, ShareRowExclusiveLock,
475496
ExclusiveLock and AccessExclusiveLock modes.
476497
</para>
477498
</listitem>
@@ -488,7 +509,8 @@ ERROR: Can't serialize access due to concurrent update
488509
</para>
489510

490511
<para>
491-
Conflicts with RowShareLock, RowExclusiveLock, ShareLock,
512+
Conflicts with RowShareLock, RowExclusiveLock,
513+
ShareUpdateExclusiveLock, ShareLock,
492514
ShareRowExclusiveLock, ExclusiveLock and AccessExclusiveLock
493515
modes.
494516
</para>
@@ -503,13 +525,13 @@ ERROR: Can't serialize access due to concurrent update
503525
<para>
504526
Acquired by <command>ALTER TABLE</command>,
505527
<command>DROP TABLE</command>,
506-
<command>VACUUM</command> and <command>LOCK TABLE</command>
528+
<command>VACUUM FULL</command> and <command>LOCK TABLE</command>
507529
statements.
508530
</para>
509531

510532
<para>
511533
Conflicts with all modes (AccessShareLock, RowShareLock,
512-
RowExclusiveLock, ShareLock,
534+
RowExclusiveLock,ShareUpdateExclusiveLock,ShareLock,
513535
ShareRowExclusiveLock, ExclusiveLock and AccessExclusiveLock).
514536
</para>
515537
</listitem>

‎doc/src/sgml/ref/lock.sgml

Lines changed: 53 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!--
2-
$Header: /cvsroot/pgsql/doc/src/sgml/ref/lock.sgml,v 1.23 2000/12/25 23:15:26 petere Exp $
2+
$Header: /cvsroot/pgsql/doc/src/sgml/ref/lock.sgml,v 1.24 2001/07/09 22:18:33 tgl Exp $
33
Postgres documentation
44
-->
55

@@ -20,20 +20,23 @@ Postgres documentation
2020
</refnamediv>
2121
<refsynopsisdiv>
2222
<refsynopsisdivinfo>
23-
<date>1999-07-20</date>
23+
<date>2001-07-09</date>
2424
</refsynopsisdivinfo>
2525
<synopsis>
2626
LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable>
27-
LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN [ ROW | ACCESS ] { SHARE | EXCLUSIVE } MODE
28-
LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN SHARE ROW EXCLUSIVE MODE
27+
LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN <replaceable class="PARAMETER">lockmode</replaceable> MODE
28+
29+
where <replaceable class="PARAMETER">lockmode</replaceable> is one of:
30+
31+
ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE |
32+
SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
2933
</synopsis>
3034

3135
<refsect2 id="R2-SQL-LOCK-1">
3236
<refsect2info>
3337
<date>1999-06-09</date>
3438
</refsect2info>
3539

36-
3740
<title>
3841
Inputs
3942
</title>
@@ -62,7 +65,7 @@ LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN SHARE ROW EX
6265
This is the least restrictive lock mode. It conflicts only with
6366
ACCESS EXCLUSIVE mode. It is used to protect a table from being
6467
modified by concurrent <command>ALTER TABLE</command>,
65-
<command>DROP TABLE</command> and <command>VACUUM</command>
68+
<command>DROP TABLE</command> and <command>VACUUM FULL</command>
6669
commands.
6770
</para>
6871
</listitem>
@@ -102,6 +105,25 @@ LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN SHARE ROW EX
102105
</listitem>
103106
</varlistentry>
104107

108+
<varlistentry>
109+
<term>SHARE UPDATE EXCLUSIVE MODE</term>
110+
<listitem>
111+
<note>
112+
<para>
113+
Automatically acquired by <command>VACUUM</command> (without
114+
<option>FULL</option>).
115+
</para>
116+
</note>
117+
118+
<para>
119+
Conflicts with SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE,
120+
EXCLUSIVE and
121+
ACCESS EXCLUSIVE modes. This mode protects a table against
122+
concurrent schema changes and VACUUMs.
123+
</para>
124+
</listitem>
125+
</varlistentry>
126+
105127
<varlistentry>
106128
<term>SHARE MODE</term>
107129
<listitem>
@@ -113,9 +135,10 @@ LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN SHARE ROW EX
113135
</note>
114136

115137
<para>
116-
Conflicts with ROW EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE and
138+
Conflicts with ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE,
139+
SHARE ROW EXCLUSIVE, EXCLUSIVE and
117140
ACCESS EXCLUSIVE modes. This mode protects a table against
118-
concurrent updates.
141+
concurrentdataupdates.
119142
</para>
120143
</listitem>
121144
</varlistentry>
@@ -125,14 +148,14 @@ LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN SHARE ROW EX
125148
<listitem>
126149
<note>
127150
<para>
128-
This is like EXCLUSIVE MODE, but allowsSHAREROW locks
151+
This is like EXCLUSIVE MODE, but allows ROW SHARE locks
129152
by others.
130153
</para>
131154
</note>
132155

133156
<para>
134-
Conflicts with ROW EXCLUSIVE, SHARE, SHARE ROWEXCLUSIVE,
135-
EXCLUSIVE and ACCESS EXCLUSIVE modes.
157+
Conflicts with ROW EXCLUSIVE, SHARE UPDATEEXCLUSIVE, SHARE,
158+
SHARE ROW EXCLUSIVE,EXCLUSIVE and ACCESS EXCLUSIVE modes.
136159
</para>
137160
</listitem>
138161
</varlistentry>
@@ -149,7 +172,8 @@ LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN SHARE ROW EX
149172
</note>
150173

151174
<para>
152-
Conflicts with ROW SHARE, ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE,
175+
Conflicts with ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE,
176+
SHARE, SHARE ROW EXCLUSIVE,
153177
EXCLUSIVE and ACCESS EXCLUSIVE modes.
154178
</para>
155179
</listitem>
@@ -161,9 +185,10 @@ LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN SHARE ROW EX
161185
<note>
162186
<para>
163187
Automatically acquired by <command>ALTER TABLE</command>,
164-
<command>DROP TABLE</command>, <command>VACUUM</command> statements.
165-
This is the most restrictive lock mode which conflicts with all other
166-
lock modes and protects a locked table from any concurrent operations.
188+
<command>DROP TABLE</command>, <command>VACUUM FULL</command>
189+
statements.
190+
This is the most restrictive lock mode which
191+
protects a locked table from any concurrent operations.
167192
</para>
168193
</note>
169194

@@ -174,6 +199,10 @@ LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN SHARE ROW EX
174199
lock mode option).
175200
</para>
176201
</note>
202+
203+
<para>
204+
Conflicts with all lock modes.
205+
</para>
177206
</listitem>
178207
</varlistentry>
179208
</variablelist>
@@ -241,7 +270,11 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
241270
<term>EXCLUSIVE</term>
242271
<listitem>
243272
<para>
244-
Exclusive lock that prevents other locks from being granted.
273+
An exclusive lock prevents other locks of the same type from being
274+
granted. (Note: ROW EXCLUSIVE mode does not follow this naming
275+
convention perfectly, since it is shared at the level of the table;
276+
it is exclusive only with respect to specific rows that are being
277+
updated.)
245278
</para>
246279
</listitem>
247280
</varlistentry>
@@ -250,7 +283,8 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
250283
<term>SHARE</term>
251284
<listitem>
252285
<para>
253-
Allows others to share lock. Prevents EXCLUSIVE locks.
286+
A shared lock allows others to also hold the same type of lock,
287+
but prevents the corresponding EXCLUSIVE lock from being granted.
254288
</para>
255289
</listitem>
256290
</varlistentry>
@@ -273,13 +307,6 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
273307
</listitem>
274308
</varlistentry>
275309
</variablelist>
276-
277-
<note>
278-
<para>
279-
If EXCLUSIVE or SHARE are not specified, EXCLUSIVE is assumed.
280-
Locks exist for the duration of the transaction.
281-
</para>
282-
</note>
283310
</para>
284311

285312
<para>
@@ -370,8 +397,8 @@ ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
370397
</para>
371398

372399
<para>
373-
Except for ACCESS SHARE/EXCLUSIVE lock modes, all other
374-
<productname>Postgres</productname> lock modes and the
400+
Except for ACCESS SHARE, ACCESS EXCLUSIVE, and SHARE UPDATE EXCLUSIVE lock
401+
modes, the<productname>Postgres</productname> lock modes and the
375402
<command>LOCK TABLE</command> syntax are compatible with those
376403
present in <productname>Oracle</productname>.
377404
</para>

‎src/backend/parser/gram.y

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.233 2001/06/30 22:03:25 petere Exp $
14+
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.234 2001/07/09 22:18:33 tgl Exp $
1515
*
1616
* HISTORY
1717
* AUTHORDATEMAJOR EVENT
@@ -153,7 +153,7 @@ static void doNegateFloat(Value *v);
153153
%type<list>createdb_opt_list,createdb_opt_item
154154

155155
%type<ival>opt_lock,lock_type
156-
%type<boolean>opt_lmode,opt_force
156+
%type<boolean>opt_force
157157

158158
%type<ival>user_createdb_clause,user_createuser_clause
159159
%type<str>user_passwd_clause
@@ -3277,18 +3277,18 @@ LockStmt:LOCK_P opt_table relation_name opt_lock
32773277
}
32783278
;
32793279

3280-
opt_lock:INlock_typeMODE{$$ =$2; }
3280+
opt_lock:INlock_typeMODE{$$ =$2; }
32813281
|/*EMPTY*/{$$ = AccessExclusiveLock; }
32823282
;
32833283

3284-
lock_type:SHAREROWEXCLUSIVE{$$ =ShareRowExclusiveLock; }
3285-
|ROWopt_lmode{$$ =($2?RowShareLock: RowExclusiveLock); }
3286-
|ACCESSopt_lmode{$$ =($2? AccessShareLock: AccessExclusiveLock); }
3287-
|opt_lmode{$$ =($1? ShareLock: ExclusiveLock); }
3288-
;
3289-
3290-
opt_lmode:SHARE{$$ =TRUE; }
3291-
|EXCLUSIVE{$$ =FALSE; }
3284+
lock_type:ACCESSSHARE{$$ =AccessShareLock; }
3285+
|ROWSHARE{$$ = RowShareLock; }
3286+
|ROWEXCLUSIVE{$$ =RowExclusiveLock; }
3287+
|SHAREUPDATEEXCLUSIVE{$$ =ShareUpdateExclusiveLock; }
3288+
|SHARE{$$ = ShareLock; }
3289+
|SHAREROWEXCLUSIVE{$$ = ShareRowExclusiveLock; }
3290+
|EXCLUSIVE{$$ =ExclusiveLock; }
3291+
|ACCESSEXCLUSIVE{$$ =AccessExclusiveLock; }
32923292
;
32933293

32943294

‎src/backend/storage/lmgr/lmgr.c

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lmgr.c,v 1.48 2001/06/22 00:04:59 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lmgr.c,v 1.49 2001/07/09 22:18:33 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -33,25 +33,35 @@ static LOCKMASK LockConflicts[] = {
3333
(1 <<ExclusiveLock) | (1 <<AccessExclusiveLock),
3434

3535
/* RowExclusiveLock */
36-
(1 <<ExclusiveLock) | (1 <<ShareRowExclusiveLock) | (1 <<ShareLock) |
37-
(1 <<AccessExclusiveLock),
36+
(1 <<ShareLock) | (1 <<ShareRowExclusiveLock) |
37+
(1 <<ExclusiveLock) | (1 <<AccessExclusiveLock),
38+
39+
/* ShareUpdateExclusiveLock */
40+
(1 <<ShareUpdateExclusiveLock) |
41+
(1 <<ShareLock) | (1 <<ShareRowExclusiveLock) |
42+
(1 <<ExclusiveLock) | (1 <<AccessExclusiveLock),
3843

3944
/* ShareLock */
40-
(1 <<ExclusiveLock) | (1 <<ShareRowExclusiveLock) |
41-
(1 <<RowExclusiveLock) | (1 <<AccessExclusiveLock),
45+
(1 <<RowExclusiveLock) | (1 <<ShareUpdateExclusiveLock) |
46+
(1 <<ShareRowExclusiveLock) |
47+
(1 <<ExclusiveLock) | (1 <<AccessExclusiveLock),
4248

4349
/* ShareRowExclusiveLock */
44-
(1 <<ExclusiveLock) | (1 <<ShareRowExclusiveLock) |
45-
(1 <<ShareLock) | (1 <<RowExclusiveLock) | (1 <<AccessExclusiveLock),
50+
(1 <<RowExclusiveLock) | (1 <<ShareUpdateExclusiveLock) |
51+
(1 <<ShareLock) | (1 <<ShareRowExclusiveLock) |
52+
(1 <<ExclusiveLock) | (1 <<AccessExclusiveLock),
4653

4754
/* ExclusiveLock */
48-
(1 <<ExclusiveLock) | (1 <<ShareRowExclusiveLock) | (1 <<ShareLock) |
49-
(1 <<RowExclusiveLock) | (1 <<RowShareLock) | (1 <<AccessExclusiveLock),
55+
(1 <<RowShareLock) |
56+
(1 <<RowExclusiveLock) | (1 <<ShareUpdateExclusiveLock) |
57+
(1 <<ShareLock) | (1 <<ShareRowExclusiveLock) |
58+
(1 <<ExclusiveLock) | (1 <<AccessExclusiveLock),
5059

5160
/* AccessExclusiveLock */
52-
(1 <<ExclusiveLock) | (1 <<ShareRowExclusiveLock) | (1 <<ShareLock) |
53-
(1 <<RowExclusiveLock) | (1 <<RowShareLock) |
54-
(1 <<AccessExclusiveLock) | (1 <<AccessShareLock)
61+
(1 <<AccessShareLock) | (1 <<RowShareLock) |
62+
(1 <<RowExclusiveLock) | (1 <<ShareUpdateExclusiveLock) |
63+
(1 <<ShareLock) | (1 <<ShareRowExclusiveLock) |
64+
(1 <<ExclusiveLock) | (1 <<AccessExclusiveLock)
5565

5666
};
5767

@@ -63,14 +73,16 @@ static intLockPrios[] = {
6373
2,
6474
/* RowExclusiveLock */
6575
3,
66-
/*ShareLock */
76+
/*ShareUpdateExclusiveLock */
6777
4,
68-
/*ShareRowExclusiveLock */
78+
/*ShareLock */
6979
5,
70-
/*ExclusiveLock */
80+
/*ShareRowExclusiveLock */
7181
6,
82+
/* ExclusiveLock */
83+
7,
7284
/* AccessExclusiveLock */
73-
7
85+
8
7486
};
7587

7688
LOCKMETHODLockTableId= (LOCKMETHOD)NULL;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp