From: | Craig Ringer <craig(at)postnewspapers(dot)com(dot)au> |
---|---|
To: | Роман Маширов <mrj(at)nandu(dot)ru> |
Cc: | PostgreSQL General <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Avoiding deadlocks on mass delete / update |
Date: | 2010-03-24 04:30:31 |
Message-ID: | 4BA99567.6070502@postnewspapers.com.au |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Роман Маширов wrote:
> I've got a simple 'spool' table, one process 'worker' reads and updates
> this table, other 'stat' performs 'delete ... where ... returning *'.
> Sometimes I've got dedlocks on delete operation in 'stat', seems like at
> the moment of expiration of data by timeout some state changes arrived
> from worker. So the question, is it possible to somehow set order of row
> deletion in such bulk delete operation, to avoid deadlocks?
OK, so for the sake of example, WORKER is UPDATEing rows that stat is
trying to DELETE at the same time, such that worker holds a lock on row
A and wants a lock on row B, but stat holds B and wants A?
In other words, the deadlock is an _interaction_ between 'stat' and
'worker'?
Can you post the queries?
One option is to SELECT ... FOR UPDATE NOWAIT before your UPDATE or DELETE.
http://www.postgresql.org/docs/8.4/static/sql-select.html#SQL-FOR-UPDATE-SHARE
http://www.postgresql.org/docs/8.4/static/explicit-locking.html#LOCKING-ROWS
Some kind of discussion of row level lock ordering might be in order for
the manual, actually. If there is one, it needs a link from the above
sections. The section on deadlocks:
http://www.postgresql.org/docs/8.4/static/explicit-locking.html#LOCKING-DEADLOCKS
doesn't mention how to avoid deadlock when multi-row updates/deletes are
being used concurrently.
--
Craig Ringer
From | Date | Subject | |
---|---|---|---|
Next Message | Nilesh Govindarajan | 2010-03-24 05:17:53 | Re: Help me with this multi-table query |
Previous Message | Craig Ringer | 2010-03-24 04:13:57 | Re: server-side extension in c++ |