I'm using Psycopg2 in Python to access a PostgreSQL database. I'm curious if it's safe to use the with closing() pattern to create and use a cursor, or if I should use an explicit try/except wrapped around the query. My question is concerning inserting or updating, and transactions. As I understand it, all Psycopg2 queries occur within a transaction, and it's up to calling code to commit or rollback the transaction. If within a with closing(... block an error occurs, is a rollback issued? In older versions of Psycopg2, a rollback was explicitly issued on close() but this is not the case anymore (see https://www.psycopg.org/docs/connection.html#connection.close). My question might make more sense with an example. Here's an example using with closing(... with closing(db.cursor()) as cursor: cursor.execute("""UPDATE users SET password = %s, salt = %s WHERE user_id = %s""", (pw_tuple[0], pw_tuple[1], user_id)) module.rase_unexpected_error() cursor.commit() What happens when module.raise_unexpected_error() raises its error? Is the transaction rolled back? As I understand transactions, I either need to commit them or roll them back. So in this case, what happens? Alternately I could write my query like this: cursor = None try: cursor = db.cursor() cursor.execute("""UPDATE users SET password = %s, salt = %s WHERE user_id = %s""", (pw_tuple[0], pw_tuple[1], user_id)) module.rase_unexpected_error() cursor.commit() except BaseException: if cursor is not None: cursor.rollback() finally: if cursor is not None: cursor.close() Also I should mention that I have no idea if Psycopg2's connection class cursor() method could raise an error or not (the documentation doesn't say) so better safe than sorry, no? Which method of issuing a query and managing a transaction should I use? Continue reading...