Re: AUTOCOMMIT off + ON_ERROR_ROLLBACK usability - Mailing list pgsql-hackers

From Noah Misch
Subject Re: AUTOCOMMIT off + ON_ERROR_ROLLBACK usability
Date
Msg-id 20140317224820.GB3824224@tornado.leadboat.com
Whole thread Raw
In response to AUTOCOMMIT off + ON_ERROR_ROLLBACK usability  (Greg Stark <stark@mit.edu>)
List pgsql-hackers
On Sun, Mar 16, 2014 at 11:58:53AM +0000, Greg Stark wrote:
> I've been putting my money where my mouth is and running with
> AUTOCOMMIT=off and ON_ERROR_ROLLBACK set which I've been recommending
> for years but hadn't gotten around to switching to myself.
> 
> I think we knew the user experience wasn't perfect but it would be
> nice to enumerate the problems and they don't seem insurmountable.
> Some of them seem quite trivial.
> 
> 1) I find it essential to add %x to the prompt or else I'm a)
> continually forgetting to commit and b) continually being surprised by
> being in a transaction when I didn't expect or need to be. In fact I
> added it three times as '%/%R%x%x%x%# '. It would be nice to be able
> to put something else other than * there though.
> 
> 2) Some commands begin transactions that are a complete surprise.
> CHECKPOINT in particular was a shock.

psql limits special treatment to PreventTransactionChain() commands, more or
less.  I grant that there are other credible policies, but it would take a
strong benefit to switch policies now.

> 3) Plain SELECTs in read committed mode begin a transaction even
> though there's no purpose served by the transaction -- there are no
> snapshots pending and the locks taken don't seem relevant to
> subsequent queries. I suppose it means if you select multiple times
> from the same table you're guaranteed to get a consistent schema but
> since DML can commit in between that doesn't seem useful.

Any function or operator could modify the database.  psql has no general way
to distinguish, in advance, SELECTs that do change the database.

> Notably \d
> and the like do *not* begin a new transaction.

It's probably not worth changing \d itself, but I would like it if more
backslash commands respected ON_ERROR_ROLLBACK.  This is a wart:

[local] test=# \set ON_ERROR_ROLLBACK on \unset AUTOCOMMIT
[local] test=# select 1;?column? 
----------       1
(1 row)

[local] test=# \ef no_such_function
ERROR:  function "no_such_function" does not exist
[local] test=# select 1;
ERROR:  current transaction is aborted, commands ignored until end of transaction block

> 3) Some commands can't be run in a transaction such as VACUUM and
> CREATE INDEX CONCURRENTLY and since you're often in a transaction
> unexpectedly this often gets in your way.
> 
> I think the user expectation is that if after running a command the
> session still only has a vxid and has no remaining snapshots (i.e.
> it's not in serializable or read consistent mode) then the transaction
> will just automatically commit/abort after the command. I'm not sure
> if it's safe to go that far but it sure would be nice.

You could offer that under "\set AUTOCOMMIT trivial", perhaps.  I would not be
an early adopter, but I can imagine folks liking it.  Both DBI and JDBC have
autocommit-off features that consistently require an explicit COMMIT from the
user.  psql's similar policy meets my expectations.

-- 
Noah Misch
EnterpriseDB                                 http://www.enterprisedb.com



pgsql-hackers by date:

Previous
From: Merlin Moncure
Date:
Subject: Re: Planner hints in Postgresql
Next
From: Jim Nasby
Date:
Subject: Re: pg_dump without explicit table locking