mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
Reset ALTER TABLE lock levels to AccessExclusiveLock in all cases.
Locks on inheritance parent remain at lower level, as they were before. Remove entry from 9.1 release notes.
This commit is contained in:
parent
4fa046a39e
commit
2c3d9db56d
@ -846,8 +846,7 @@
|
|||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
Add functions to control streaming replication replay (Simon
|
Add functions to control streaming replication replay (Simon Riggs)
|
||||||
Riggs)
|
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
@ -1742,20 +1741,6 @@
|
|||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Minimize lock levels for <link
|
|
||||||
linkend="SQL-CREATETRIGGER"><command>CREATE TRIGGER</></link>
|
|
||||||
and many <link linkend="SQL-ALTERTABLE"><command>ALTER
|
|
||||||
TABLE</></link> and <link linkend="SQL-CREATERULE"><command>CREATE
|
|
||||||
RULE</></link> operations (Simon Riggs)
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This improves database availability when altering active databases.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|
||||||
</sect4>
|
</sect4>
|
||||||
|
@ -2578,6 +2578,31 @@ AlterTableInternal(Oid relid, List *cmds, bool recurse)
|
|||||||
LOCKMODE
|
LOCKMODE
|
||||||
AlterTableGetLockLevel(List *cmds)
|
AlterTableGetLockLevel(List *cmds)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Late in 9.1 dev cycle a number of issues were uncovered with access
|
||||||
|
* to catalog relations, leading to the decision to re-enforce all DDL
|
||||||
|
* at AccessExclusiveLock level by default.
|
||||||
|
*
|
||||||
|
* The issues are that there is a pervasive assumption in the code that
|
||||||
|
* the catalogs will not be read unless an AccessExclusiveLock is held.
|
||||||
|
* If that rule is relaxed, we must protect against a number of potential
|
||||||
|
* effects - infrequent, but proven possible with test cases where
|
||||||
|
* multiple DDL operations occur in a stream against frequently accessed
|
||||||
|
* tables.
|
||||||
|
*
|
||||||
|
* 1. Catalog tables are read using SnapshotNow, which has a race bug
|
||||||
|
* that allows a scan to return no valid rows even when one is present
|
||||||
|
* in the case of a commit of a concurrent update of the catalog table.
|
||||||
|
* SnapshotNow also ignores transactions in progress, so takes the
|
||||||
|
* latest committed version without waiting for the latest changes.
|
||||||
|
*
|
||||||
|
* 2. Relcache needs to be internally consistent, so unless we lock the
|
||||||
|
* definition during reads we have no way to guarantee that.
|
||||||
|
*
|
||||||
|
* 3. Catcache access isn't coordinated at all so refreshes can occur at
|
||||||
|
* any time.
|
||||||
|
*/
|
||||||
|
#ifdef REDUCED_ALTER_TABLE_LOCK_LEVELS
|
||||||
ListCell *lcmd;
|
ListCell *lcmd;
|
||||||
LOCKMODE lockmode = ShareUpdateExclusiveLock;
|
LOCKMODE lockmode = ShareUpdateExclusiveLock;
|
||||||
|
|
||||||
@ -2726,6 +2751,9 @@ AlterTableGetLockLevel(List *cmds)
|
|||||||
if (cmd_lockmode > lockmode)
|
if (cmd_lockmode > lockmode)
|
||||||
lockmode = cmd_lockmode;
|
lockmode = cmd_lockmode;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
LOCKMODE lockmode = AccessExclusiveLock;
|
||||||
|
#endif
|
||||||
|
|
||||||
return lockmode;
|
return lockmode;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user