Search Postgresql Archives

SELECT FOR UPDATE with ORDER BY to avoid row-level deadlock?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

My problem is that if I try to update more than one row in a table like
> UPDATE mytable SET something = 84 WHERE not_unique_col = 41;
in two concurrent transactions, it can result in a deadlock if the two 
UPDATEs visit the rows in a different order.
The same applies, if I try to
> SELECT * FROM mytable WHERE not_unique_col = 41 FOR UPDATE;

But what if I try like
> SELECT * FROM mytable
> WHERE not_unique_col = 41 ORDER BY pri_key ASC FOR UPDATE;
and do the UPDATE after this? It should never lead to a deadlock, 
assuming the rows selected FOR UPDATE are locked in the order as 
they are returned.
But is that true? Are the rows selected FOR UPDATE locked in the same 
order as they are returned (as specified in ORDER BY)?

I'm not quite sure (though I tested it on a small table and it looked 
fine), because I (or should I say Google) could not find even one page 
on postgresql.org where this row-level deadlock situation had been 
solved... I could only find Tom Lane's post, where he admitted that this 
can lead to a deadlock:
http://archives.postgresql.org/pgsql-general/2004-11/msg01372.php
I don't believe that no one thought of this solution before, so there 
must be something wrong with it... :)

Regards,
Panther

PS: Sorry if this will be a double-post, but it looks like my previous mail 
was lost somewhere...

_______________________________________________________________
Ne csak a lakást nézze, hanem a környéket is! Válogasson több 
ezer ingatlanból légifotós-kereső segítségével!
http://ad.adverticum.net/b/cl,1,6022,135082,205798/click.prm




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux