在自动提交模式下运行BEGIN时,Postgres会做什么?

时间:2010-03-19 15:32:46

标签: python sql postgresql autocommit psycopg

我正在尝试使用Postgres(psycopg)连接时更好地理解'autocommit'的概念。假设我有一个全新的连接,将其隔离级别设置为ISOLATION_LEVEL_AUTOCOMMIT,然后直接运行此SQL,而不使用游标开始/回滚方法(作为练习;不是说我实际上想要这样做):

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

INSERT C& d?

autocommit纯粹是psycopg中的一个内部设置,它会影响它发布BEGIN的方式吗?在这种情况下,上面的SQL没有被感染; INSERT A& B一旦完成就会做出承诺,而C& D在事务中运行并回滚。该交易运行的隔离级别是什么?

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

还是我完全偏离目标?

3 个答案:

答案 0 :(得分:3)

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

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

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

启用自动提交功能后,只会回滚cd

请注意PostgreSQLAUTOCOMMIT以来没有内部8.0行为:所有自动提交功能都依赖于客户端。

答案 1 :(得分:1)

默认情况下,PostgreSQL具有自动提交功能,这意味着每个语句都作为事务处理。如果您明确告诉它开始一个事务,就像在您的示例中那样,那些项目都在新事务中。

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

答案 2 :(得分:1)

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

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