table lock when where clause uses unique constraing instead of primary key.

Поиск
Список
Период
Сортировка
От Jeff Amiel
Тема table lock when where clause uses unique constraing instead of primary key.
Дата
Msg-id 1383584788.93216.YahooMailNeo@web161406.mail.bf1.yahoo.com
обсуждение исходный текст
Ответы Re: table lock when where clause uses unique constraing instead of primary key.  (Rob Sargent <robjsargent@gmail.com>)
Re: table lock when where clause uses unique constraing instead of primary key.  (Jeff Amiel <becauseimjeff@yahoo.com>)
Re: table lock when where clause uses unique constraing instead of primary key.  (Adrian Klaver <adrian.klaver@gmail.com>)
Список pgsql-general
PostgreSQL 9.2.4 on x86_64-pc-solaris2.10, compiled by gcc (GCC) 3.4.3 (csl-sol210-3_4-branch+sol_rpath), 64-bit
Have got an annoying scenario that has been creating issues for us for years….
Time to try to figure it out.
Essentially, we have a user table where we maintain username, id number, enabled/disabled state, etc.
When a user logs in successfully, we reset any failed login attempts on the user’s unique entry in this table.

CREATE TABLE user_profile
(
  user_id serial NOT NULL,
  username character varying(50) NOT NULL,
  login_attempts integer DEFAULT 0,
  …
  CONSTRAINT user_id PRIMARY KEY (user_id),
  CONSTRAINT name UNIQUE (username)
)

However - we often get “lock storms” where SOMEHOW, updates for individual users are causing all other updates to
‘lock’on each other. 
Eventually the storm abates (sometimes in seconds - sometimes in minutes)
See edited screen cap:
http://i.imgur.com/x4DdYaV.png
(PID 4899 just has a “where username = $1 cut off that you can’t see out to the right)
All updates are done using the username (unique constraint) instead of the primary key (the serial)
In retrospect, I suppose these queries should be using the primary key (9 year old code) but I am flummoxed as to how
theseupdates can be causing table? level locks. 
I’ve never been able to catch the lock information during one of these storms - but I assume it is a table level lock
causingthis. 
Thoughts?  Is this just ‘normal’ behavior that I am not expecting? (because postgres doesn’t know that the username is
aunique field) 


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

Предыдущее
От: Adam Jelinek
Дата:
Сообщение: json datatype and table bloat?
Следующее
От: Rob Sargent
Дата:
Сообщение: Re: table lock when where clause uses unique constraing instead of primary key.