Marc-Andre Lemburg <m...@egenix.com> added the comment:
I think there's a bit of a misunderstanding here. When relying on a DB-API driver's transaction API, you are not allowed to issue separate transaction commands to the DB backend via the .execute() methods. You have to use conn.commit() and conn.rollback(). The DB-API wants drivers to have connections default to transactional behavior and implicitly start transactions when opening the connection as well as when ending one (via .commit() or .rollback()) - provided the backend does support transactions. It also suggests that a method may be used to set the transactional behavior. Now, historically, many drivers have not always used methods for this, but instead (or in addition) provide a property connection.autocommit to allow setting or querying the current state. Over time, this has become more or less a standard. Aside: This is a bit unfortunate, since users would not expect exceptions from such properties (e.g. network errors), but this where things have moved and it's hard to change. I guess the SQLite driver does not start a new transaction for SELECTs, since these are usually read-only, but don't know whether this still holds today (e.g. think of UDFs running INSERTs or UPDATEs). For the same reason, removing the SELECT "optimization" may cause a backwards incompatible change, which can be tricky to identify and cause corruption of data (in this case, data not written to the database, where it previously was written). ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue39457> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com