Received: from maia.hub.org (unknown [200.46.204.183]) by mail.postgresql.org (Postfix) with ESMTP id 4170D632873 for ; Sun, 26 Jul 2009 18:28:53 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 68732-09 for ; Sun, 26 Jul 2009 21:28:42 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mail-gx0-f217.google.com (mail-gx0-f217.google.com [209.85.217.217]) by mail.postgresql.org (Postfix) with ESMTP id C995563245B for ; Sun, 26 Jul 2009 18:28:42 -0300 (ADT) Received: by gxk17 with SMTP id 17so4765348gxk.19 for ; Sun, 26 Jul 2009 14:28:41 -0700 (PDT) MIME-Version: 1.0 Received: by 10.231.14.67 with SMTP id f3mr1927770iba.36.1248643310631; Sun, 26 Jul 2009 14:21:50 -0700 (PDT) In-Reply-To: <4A681A1A.1090902@archonet.com> References: <4A67F5B6.4080409@archonet.com> <4A680603.9010707@archonet.com> <4A681A1A.1090902@archonet.com> Date: Sun, 26 Jul 2009 17:21:50 -0400 Message-ID: Subject: Re: Bit by "commands ignored until end of transaction block" again From: Glenn Maynard To: pgsql-sql@postgresql.org Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=-10 required=5 tests=none X-Spam-Level: X-Archive-Number: 200907/129 X-Sequence-Number: 32870 > The above situation only arises if you run in autocommit mode which is th= e default for psql (which I have *never* understood). This is the short answer, in practice--assume that either a transaction is started or will be started by the SAVEPOINT command, and that if a COMMIT is needed (as a result of the SAVEPOINT or which was already needed), that the caller will do it. (I hate non-autocommit. It defies basic code design instincts, which tell me that whoever starts a transaction should finish it. I shouldn't be issuing a non-autocommit SAVEPOINT/RELEASE, and then assuming the caller will COMMIT the transaction that was started automatically. I'm stuck with it in Django. Yuck, but oh well; battling the framework's idioms isn't going to help anything.) On Thu, Jul 23, 2009 at 4:06 AM, Richard Huxton wrote: >> I'm writing a Python library call. =C2=A0It has no idea whether the call= er >> happens to be inside a transaction already, and I don't want to >> specify something like "always run this inside a transaction". >> (Callers are equally likely to want to do either, and it's bad API to >> force them to start a transaction--the fact that I'm using the >> database at al should be transparent.) > > That last bit is never going to work. There always needs to be some basic > level of understanding between systems and transactions really have to be > part of that for talking to a RDBMS. There will have to be a piece of cod= e > responsible for managing transactions somewhere in the > middleware/application layers. It's never 100% transparent--the case of making calls during a transaction and then rolling the whole thing back still needs to be documented. The point, though, is that this isn't a database-centric operation, so it shouldn't have usage restrictions like "must always" or "must never be inside a transaction". > All you're doing here is moving the point of confusion around, surely? At > some point you still need to know whether you can issue > BEGIN/ROLLBACK/COMMIT etc. Not at all--I don't need to use any of these commands. I just do this: SAVEPOINT s; INSERT INTO table ...; RELEASE SAVEPOINT s; to guarantee that my code's effect on the database is atomic. someone else wrote: > So, what you're really asking for boils down to nestable transactions? That's how I've thought of savepoints from day one. When I use them in Python code, I use a with_transaction wrapper, which transparently uses a transaction or a savepoint. --=20 Glenn Maynard