Python 什么';在pyscopg2中处理事务的首选方式是什么?

Python 什么';在pyscopg2中处理事务的首选方式是什么?,python,postgresql,psycopg2,python-db-api,Python,Postgresql,Psycopg2,Python Db Api,根据,我们应该设置autocommit,以获得默认的PostgreSQL行为。根据研究,这似乎是首选的方法。我的问题是,如果这是这些情况下的最佳方法,那么如何明确启动事务?使用光标执行(“开始”) 另一方面,psycopg2提供的上下文管理器如何处理这个问题?他们会在块的开头自动启动事务并在成功时提交吗?psycopg2的事务模型有点像JDBC 要打开事务,请关闭自动提交,然后开始工作。不需要显式的BEGIN 要提交,请使用conn.commit() 如果每条语句都是一个事务,那么自动提交就可以

根据,我们应该设置
autocommit
,以获得默认的PostgreSQL行为。根据研究,这似乎是首选的方法。我的问题是,如果这是这些情况下的最佳方法,那么如何明确启动事务?使用光标执行(“开始”)


另一方面,psycopg2提供的上下文管理器如何处理这个问题?他们会在块的开头自动启动事务并在成功时提交吗?

psycopg2的事务模型有点像JDBC

要打开事务,请关闭自动提交,然后开始工作。不需要显式的
BEGIN

要提交,请使用
conn.commit()


如果每条语句都是一个事务,那么自动提交就可以了。那么就不需要显式的事务管理。

就我个人而言,我从不使用
autocommit
,几乎总是使用
语法

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)
一旦退出上下文管理器,它就会被提交

同样地

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)
        raise Exception("I changed my mind")
将导致安全回滚
SQL
语句

with
在Python中非常有用,只适用于少数需要严格控制对象生命周期的情况,例如当对象创建和销毁与事务行为相关联时