Received: from localhost (maia-2.hub.org [200.46.204.187]) by postgresql.org (Postfix) with ESMTP id 291D09FB502 for ; Fri, 13 Apr 2007 08:49:53 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.187]) (amavisd-maia, port 10024) with ESMTP id 85118-01 for ; Fri, 13 Apr 2007 08:49:43 -0300 (ADT) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.4 Received: from ciao.gmane.org (main.gmane.org [80.91.229.2]) by postgresql.org (Postfix) with ESMTP id 7FA889FB311 for ; Fri, 13 Apr 2007 08:49:47 -0300 (ADT) Received: from list by ciao.gmane.org with local (Exim 4.43) id 1HcKHM-0008A3-Ij for pgsql-sql@postgresql.org; Fri, 13 Apr 2007 13:49:24 +0200 Received: from pc035-72.amg.gda.pl ([153.19.72.35]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 13 Apr 2007 13:49:24 +0200 Received: from mstepnicki by pc035-72.amg.gda.pl with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 13 Apr 2007 13:49:24 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: pgsql-sql@postgresql.org From: =?iso-8859-2?q?Marcin_St=EApnicki?= Subject: Re: How can I know if a row is Locked? Date: Fri, 13 Apr 2007 13:48:52 +0200 Organization: Linux.PL Lines: 49 Message-ID: References: <651844.97452.qm@web57110.mail.re3.yahoo.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-2 Content-Transfer-Encoding: 8bit X-Complaints-To: usenet@sea.gmane.org X-Gmane-NNTP-Posting-Host: pc035-72.amg.gda.pl User-Agent: Pan/0.14.2.91 (As She Crawled Across the Table (Debian GNU/Linux)) X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200704/143 X-Sequence-Number: 28143 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; check for any changes since you fetched the data originally if none, UPDATE and commit else rollback and tell user 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