Re: check constraint validation takes access exclusive locks

Поиск
Список
Период
Сортировка
От hubert depesz lubaczewski
Тема Re: check constraint validation takes access exclusive locks
Дата
Msg-id 20120227130257.GA28629@depesz.com
обсуждение исходный текст
Ответ на check constraint validation takes access exclusive locks  (Pavel Stehule <pavel.stehule@gmail.com>)
Ответы Re: check constraint validation takes access exclusive locks  (Alvaro Herrera <alvherre@commandprompt.com>)
Список pgsql-hackers
On Sun, Feb 26, 2012 at 03:04:28PM +0100, Pavel Stehule wrote:
> Hello
> 
> I rechecked Depesz's article -
> http://www.depesz.com/2011/07/01/waiting-for-9-2-not-valid-checks/
> 
> The behave of current HEAD is different than behave described in article.
> 
> "alter table a validate constraint a_a_check" needs a access exclusive
> locks and blocks table modification - I tested inserts.
> 
> Is it expected behave.
> 
> session one:
> 
> postgres=# create table a(a int);
> CREATE TABLE
> postgres=# alter table a add check (a > 0) not valid;
> ALTER TABLE
> postgres=# begin;
> BEGIN
> postgres=# alter table a validate constraint a_a_check;
> ALTER TABLE
> 
> session two:
> 
> postgres=# update a set a = 100; -- it waits to commit in session one

yes, looks like we have revert to access exclusive lock:

$ begin;
BEGIN
Time: 0.352 ms

*$ ALTER TABLE test2 ADD CHECK ( field >= 0 ) NOT VALID;
ALTER TABLE
Time: 0.662 ms

*$ select * from pg_locks where pid = pg_backend_pid();  locktype    │ database │ relation │  page  │ tuple  │
virtualxid│ transactionid │ classid │ objid  │ objsubid │ virtualtransaction │ pid  │        mode         │ granted │
fastpath

───────────────┼──────────┼──────────┼────────┼────────┼────────────┼───────────────┼─────────┼────────┼──────────┼────────────────────┼──────┼─────────────────────┼─────────┼──────────relation
    │    16387 │    11070 │ [null] │ [null] │ [null]     │        [null] │  [null] │ [null] │   [null] │ 2/174
   │ 8975 │ AccessShareLock     │ t       │ tvirtualxid    │   [null] │   [null] │ [null] │ [null] │ 2/174      │
[null] │  [null] │ [null] │   [null] │ 2/174              │ 8975 │ ExclusiveLock       │ t       │ ttransactionid │
[null]│   [null] │ [null] │ [null] │ [null]     │           854 │  [null] │ [null] │   [null] │ 2/174              │
8975│ ExclusiveLock       │ t       │ frelation      │    16387 │    18653 │ [null] │ [null] │ [null]     │
[null]│  [null] │ [null] │   [null] │ 2/174              │ 8975 │ AccessExclusiveLock │ t       │ f
 
(4 rows)

Time: 0.921 ms

Relation 18653 is table test2, of course.

*$ commit;
COMMIT

$ begin;
BEGIN
Time: 0.271 ms

*$ ALTER TABLE test2 VALIDATE CONSTRAINT test2_field_check;
ALTER TABLE
Time: 286.035 ms

*$ select * from pg_locks where pid = pg_backend_pid();  locktype    │ database │ relation │  page  │ tuple  │
virtualxid│ transactionid │ classid │ objid  │ objsubid │ virtualtransaction │ pid  │        mode         │ granted │
fastpath

───────────────┼──────────┼──────────┼────────┼────────┼────────────┼───────────────┼─────────┼────────┼──────────┼────────────────────┼──────┼─────────────────────┼─────────┼──────────relation
    │    16387 │    11070 │ [null] │ [null] │ [null]     │        [null] │  [null] │ [null] │   [null] │ 2/175
   │ 8975 │ AccessShareLock     │ t       │ tvirtualxid    │   [null] │   [null] │ [null] │ [null] │ 2/175      │
[null] │  [null] │ [null] │   [null] │ 2/175              │ 8975 │ ExclusiveLock       │ t       │ ttransactionid │
[null]│   [null] │ [null] │ [null] │ [null]     │           855 │  [null] │ [null] │   [null] │ 2/175              │
8975│ ExclusiveLock       │ t       │ frelation      │    16387 │    18653 │ [null] │ [null] │ [null]     │
[null]│  [null] │ [null] │   [null] │ 2/175              │ 8975 │ AccessExclusiveLock │ t       │ f
 
(4 rows)

Time: 0.631 ms

And it clearly shows that validation of constraint did lock the table
using AccessExclusiveLock, which kinda defeats the purpose of
INVALID/VALIDATE.

Best regards,

depesz

-- 
The best thing about modern society is how easy it is to avoid contact with it.
                  http://depesz.com/
 


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Peter Eisentraut
Дата:
Сообщение: Re: overriding current_timestamp
Следующее
От: Robert Haas
Дата:
Сообщение: Re: Initial 9.2 pgbench write results