[DB-SIG] autocommit support in pep-249
Daniele Varrazzo
daniele.varrazzo at gmail.com
Tue Sep 13 12:28:52 CEST 2011
On Mon, Sep 12, 2011 at 11:20 PM, Chris Clark <Chris.Clark at ingres.com> wrote:
> I was discussing with someone today autocommit support and found an area of
> pep-249 where I think we could improve the wording (and the spec):
Agreed, it would have been long due. The quick survey I did when we
introduced the session in psycopg (last May) has been:
- MySQLdb: conn.autocommit()
- cx_Oracle: conn.autocommit (attribute, not function)
- pyodbc: conn.autocommit (attribute)
- sqlite3: conn.isolation_level = None
- KInterbaseDB: not supported
(to give context, in psycopg you had to use
conn.set_isolation_level(0) before version 2.4.2, when we introduced
better ways to manipulate the session - see
<http://archives.postgresql.org/psycopg/2011-05/msg00026.php> for the
discussion. Psycopg now uses an autocommit attribute - see
<http://initd.org/psycopg/docs/connection.html#connection.autocommit>).
> To get the ball rolling, here is an initial suggestion:
>
> * needs to take a boolean flag as a parameter to enable and also disable
> * needs to return the auto commit state so it can be queried
[thus]
> autocommit(on=None)
> returns True when autocommit is on, and False when autocommit is off.
> If the keyword parameter "on" is set to True, the connection will
> commit any open transactions (as if connection.commit() was issued) and all
> subsequent transactions will auto commit, the method returns True if
> successfully in autocommit mode.
> If the keyword parameter "on" is set to False, the connection will
> commit any open transactions (as if connection.commit() was issued) and all
> subsequent transactions will no longer auto commit, the method returns False
> if successfully out of autocommit mode..
Because you need a getter and a setter, I feel the right solution is
to use a property. A function that behaves as a getter when called
with no parameter and as a setter if it has one is not something
widely used in pythonland. A more natural solution, but inferior,
would be using two functions (of which choosing the name is a
bikeshedding bloodbath). Properties are just the right tools for this
task, and appear to be the most used solution in popular drivers.
The behaviour of setting autocommit when a transaction is already open
is also to be seen: there are three basic option:
- have a commit
- have a rollback
- have an error
I feel the implicit commit is the most dangerous option. An implicit
rollback may be more acceptable (it's the same behaviour of closing
the connection with a transaction in progress): I proposed it for
psycopg but, in the discussion, raising an exception proved the most
popular option.
-- Daniele
More information about the DB-SIG
mailing list