Re: How can I know if a row is Locked? - Mailing list pgsql-sql

From Marcin Stępnicki
Subject Re: How can I know if a row is Locked?
Date
Msg-id pan.2007.04.13.11.48.51.897436@gmail.com
Whole thread Raw
In response to How can I know if a row is Locked?  (Carlos Santos <carloscompels@yahoo.com.br>)
List pgsql-sql
Dnia Fri, 13 Apr 2007 04:27:34 -0700, Carlos Santos napisał(a):

> How can I know if a row is locked by another transaction.
> I have in a transaction like that:
> 
> BEGIN;
> SELECT * FROM compels.teste WHERE id = '1' FOR UPDATE;
> 
> PS1: where id is the primary key.
> PS2: The COMMIT command is done after a long time.

I've a feeling that you're trying to do a BadThing(tm). It shouldn't be
necessary unless you've got some very specific needs.

To quote Tom Lane:

---
> Is there a recommended "postgres way" to determine if a certain row is
> locked... without blocking?

8.1 has a SELECT FOR UPDATE NOWAIT option.  Alternatively, just do a
wait while having a very short statement_timeout.

> In my custom postgres client app I'd like to be able to determine if
> another user is "modifying" a given record. If so, I would present a
> dialog to the user such as "Record Locked. Sam Smith is already
> modifying this record. Try again later."

However, I think the question is moot because it's predicated on a
terrible underlying approach.  You should NEVER design a DB app to hold
a lock while some user is editing a record (and answering the phone,
going out to lunch, etc).  Fetch the data and then let the user edit
it while you are not in a transaction.  When he clicks UPDATE, do       BEGIN;       SELECT the row FOR UPDATE;
checkfor any changes since you fetched the data originally       if none, UPDATE and commit       else rollback and
telluser about it
 

If you do see conflicting changes, then you have enough info to resolve
the conflicts or abandon the update. 
---

-- 
| And Do What You Will be the challenge | http://apcoln.linuxpl.org
|    So be it in love that harms none   | http://biznes.linux.pl
|   For this is the only commandment.   | http://www.juanperon.info
`---*  JID: Aragorn_Vime@jabber.org *---' http://www.naszedzieci.org 




pgsql-sql by date:

Previous
From: Andrew Sullivan
Date:
Subject: Re: A long-running transaction
Next
From: Andrew Sullivan
Date:
Subject: Re: We all are looped on Internet: request + transport = invariant