在使用 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
将回滚所有四个语句
当自动提交打开时,只有 c
和 d
被回滚。
请注意,自 8.0
以来,PostgreSQL
没有内部 AUTOCOMMIT
行为:所有自动提交功能都依赖于客户端。
关于python - 当 BEGIN 在自动提交模式下的连接上运行时,Postgres 会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2478518/