我正在使用psycopg2
数据库 API 对 PostgreSQL 9.3 做一些工作。
我将 DB API 设置为最低隔离级别(“自动提交”模式),并直接通过 SQL 管理我自己的事务。例子:
cur = self.conn.cursor()
cur.execute("BEGIN;")
cur.execute("SELECT dbId, downloadPath, fileName, tags FROM {tableName} WHERE dlState=%s".format(tableName=self.tableName), (2, ))
ret = cur.fetchall()
cur.execute("COMMIT;")
基本上,由仅限于该游标启动的事务,cur.execute("BEGIN;")
还是针对整个连接(self.conn.cursor()
)?
我正在做的一些更复杂的事情涉及多个单独的数据库操作,我在逻辑上将其分解为函数。由于这一切都在一个将连接作为成员的类中,因此在每个函数中创建游标要方便得多。但是,我不确定在事务中创建游标是如何工作的。
基本上,如果事务是每个连接的,我可以在事务中即时创建大量游标。如果它们是每个光标的,那意味着我必须将光标传递到任何地方。它是哪一个?
文档没有涉及到这一点,尽管您可以调用这一事实connection.commit()
使我相当确信事务控制是每个连接的。
事务是每个会话的,即每个连接。
PostgreSQL 不支持暂停和恢复事务,因此 psycopg2 不能使它们成为每个游标,除非它在幕后隐式创建新连接。
在实践中,我发现 psycopg2 的游标并不是特别有用。如果您不使用来自服务器的增量获取,它们可以保留结果集,但我认为它们在其他方面没有什么用处。
为什么要手动发出
begin
,commit
而不是使用它们的连接方法?从psycopg2文档中:
同时,从 2.4.2 版本开始,有
autocommit
属性(强调添加):