From: Daniel Fortunov Date: Thu, 6 Aug 2020 23:48:25 +0000 (+0100) Subject: Don't be so eager to execute 'begin' X-Git-Tag: 3.0.dev0~468 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5aac96f0cc28474baa657a7bc69b57afa39610b5;p=thirdparty%2Fpsycopg.git Don't be so eager to execute 'begin' Only execute an automatic 'begin' statement if the TransactionStatus is IDLE, so that a failure to execute 'begin' doesn't overshadow a failure to execute a user query. --- diff --git a/psycopg3/psycopg3/connection.py b/psycopg3/psycopg3/connection.py index 0f0e320da..8529b4446 100644 --- a/psycopg3/psycopg3/connection.py +++ b/psycopg3/psycopg3/connection.py @@ -241,7 +241,7 @@ class Connection(BaseConnection): if self._autocommit: return - if self.pgconn.transaction_status == TransactionStatus.INTRANS: + if self.pgconn.transaction_status != TransactionStatus.IDLE: return self.pgconn.send_query(b"begin") @@ -349,7 +349,7 @@ class AsyncConnection(BaseConnection): if self._autocommit: return - if self.pgconn.transaction_status == TransactionStatus.INTRANS: + if self.pgconn.transaction_status != TransactionStatus.IDLE: return self.pgconn.send_query(b"begin") diff --git a/tests/test_connection.py b/tests/test_connection.py index 4bcd95693..562a54dd8 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -107,6 +107,9 @@ def test_auto_transaction_fail(conn): cur.execute("meh") assert conn.pgconn.transaction_status == conn.TransactionStatus.INERROR + with pytest.raises(psycopg3.errors.InFailedSqlTransaction): + cur.execute("select 1") + conn.commit() assert conn.pgconn.transaction_status == conn.TransactionStatus.IDLE assert cur.execute("select * from foo").fetchone() is None