1

在使用 Postgres (psycopg) 连接时,我试图更好地理解“自动提交”的概念。假设我有一个新连接,将其隔离级别设置为 ISOLATION_LEVEL_AUTOCOMMIT,然后直接运行此 SQL,而不使用游标开始/回滚方法(作为练习;并不是说我真的想这样做):

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

插入 C 和 D 会发生什么?

自动提交是否纯粹是 psycopg 中的一个内部设置,会影响它如何发出 BEGIN?在这种情况下,上述 SQL 不受影响;插入 A 和 B 完成后立即提交,而 C 和 D 在事务中运行并回滚。该事务在什么隔离级别下运行?

还是自动提交是连接本身的真实设置?在那种情况下,它如何影响BEGIN的处理?它被忽略了,还是覆盖了自动提交设置以实际启动事务?该事务在什么隔离级别下运行?

还是我完全脱靶?

4

3 回答 3

3

自动提交模式意味着每个语句隐式地开始和结束事务。

在您的情况下,如果自动提交关闭:

  • 客户端将隐式启动第一条语句的事务
  • BEGIN发出警告说事务已经开始
  • ROLLBACK回滚所有四个语句

当自动提交打开时,只有candd被回滚。

请注意,PostgreSQL它没有内部AUTOCOMMIT行为,因为8.0:所有自动提交功能都依赖于客户端。

于 2010-03-19T15:43:44.963 回答
1

默认情况下,PostgreSQL 启用了自动提交,这意味着每个语句都作为事务处理。如果您明确告诉它启动事务,如您的示例中所示,则这些项目位于新事务中。

在您的示例中,将提交 A 和 B,将回滚 C 和 D。

于 2010-03-20T22:12:00.230 回答
1

当自动提交开启时,psycopg 只是将所有内容发送到 PostgreSQL 后端,而不尝试为您管理事务。如果您不使用 BEGIN/COMMIT/ROLLBACK,那么每个 .execute() 调用都会立即执行并提交。您可以通过发出 BEGIN/COMMIT/ROLLBACK 命令来进行自己的事务管理。显然,在自动提交模式下,您不能调用 conn.commit() 或 conn.rollback() 因为 psycopg 不会跟踪事务,而只是将您 .execute() 的任何内容直接发送到后端。

在您的示例中,将提交 A 和 B,将回滚 C 和 D。

于 2010-12-15T17:00:19.053 回答