Hi,

I would ask for clarification about logic of locks acquired by update
statements within serializable transactions.
Tried postgres 9.3.6 and postgres 9.4.4.

*Story 1.*

testdb=# \dS+ t
>                           Table "public.t"
>  Column |  Type   | Modifiers | Storage | Stats target | Description
> --------+---------+-----------+---------+--------------+-------------
>  s      | integer | not null  | plain   |              |
>  i      | integer |           | plain   |              |
> Indexes:
>     "t_pkey" PRIMARY KEY, btree (s)
> Has OIDs: no


testdb=# begin transaction isolation level serializable;
> BEGIN
> testdb=# update t set i=867 where s=2;
> UPDATE 1


And this it what I've expected: SIReadLock + RowExclusiveLock:

testdb=# SELECT
> t.relname,l.locktype,page,virtualtransaction,pid,mode,granted
> from pg_locks l, pg_stat_all_tables t
> where l.relation=t.relid and t.relname = 't';
>  relname | locktype | page | virtualtransaction |  pid  |       mode
> | granted
>
> ---------+----------+------+--------------------+-------+------------------+---------
>  t       | relation |      | 12/1000023         | 30865 | RowExclusiveLock
> | t
>  t       | relation |      | 12/1000023         | 30865 | SIReadLock
> | t
> (2 rows)


* Story 2.*

testdb=# \d+ rollover
>                        Table "public.rollover"
>  Column |  Type   | Modifiers | Storage | Stats target | Description
> --------+---------+-----------+---------+--------------+-------------
>  id     | integer | not null  | plain   |              |
>  n      | integer |           | plain   |              |
> Indexes:
>     "rollover_pkey" PRIMARY KEY, btree (id)
> Has OIDs: no


testdb=# begin transaction isolation level serializable;
> BEGIN
> testdb=# update rollover set n = 5 where id = 2;
> UPDATE 1


And this is what I didn't expect:

testdb=# SELECT
> t.relname,l.locktype,page,virtualtransaction,pid,mode,granted
> from pg_locks l, pg_stat_all_tables t
> where l.relation=t.relid and t.relname = 'rollover';
>  relname  | locktype | page | virtualtransaction |  pid  |       mode
>   | granted
>
> ----------+----------+------+--------------------+-------+------------------+---------
>  rollover | relation |      | 12/1000031         | 30865 |
> RowExclusiveLock | t
> (1 row)


Why? How is it possible? I was expecting the similar SSI behaviour of this
two similar stories.

Reply via email to