python - 当 BEGIN 在自动提交模式下的连接上运行时,Postgres 会做什么?

标签 python sql postgresql autocommit psycopg

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

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

INSERT C 和 D 发生了什么?

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

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

还是我完全偏离了目标?

最佳答案

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

在你的例子中,如果自动提交关闭:

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

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

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

关于python - 当 BEGIN 在自动提交模式下的连接上运行时,Postgres 会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2478518/

相关文章:

python - QListWidget中字符后的屏蔽文本

java - 在java中更新sql记录时反斜杠消失

mysql - 有关按特定顺序选择 3 行的 SQL 帮助

sql - 应用左连接之前过滤表

sql - 在 Postgres 中使用 NOT IN 子句时的混淆

postgresql - Postgres 无法在 Azure 中的 Windows Server 2016 上启动

python - 使用 h5py 创建大量数据集 - 无法注册数据类型原子(无法插入重复键)

python - 在 Python 中将列表初始化为已知数量的元素

python - pandas 在创建面板时保留数据类型

sql - 检查行是否已经存在,如果存在则告诉引用的表 id