在PostgreSQL和psycopg2中,autocommit是什么意思?

10

PostgreSQL和Psycopg2中的autocommit是否意味着相同?

来自PostgreSQL手册

默认情况下(没有BEGIN),PostgreSQL在“autocommit”模式下执行事务,即每个语句都在自己的事务中执行,并且在语句结束时隐式执行提交(如果执行成功,否则执行回滚)

这是否意味着autocommit会为每个命令创建一个事务?

来自Psycopg2驱动程序手册

可以将连接设置为自动提交模式:这样执行的所有命令都将立即提交,并且无法回滚。一些命令(例如CREATE DATABASE、VACUUM...)需要在任何事务之外运行:为了能够从Psycopg运行这些命令,连接必须处于自动提交模式:您可以使用自动提交属性。

psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT

No transaction is started when commands are executed and no commit() or rollback() is required. Some PostgreSQL command such as CREATE DATABASE or VACUUM can’t run into a transaction: to run such command use:

>>> conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
“所有执行的命令都将立即提交”是指在Psycopg2中启用自动提交是否会为每个命令创建一个事务?
“当执行命令时,不会启动任何事务,也不需要commit()或rollback()”是指在Psycopg2中启用自动提交是否会防止为每个命令创建一个事务?
“一些PostgreSQL命令(例如CREATE DATABASE或VACUUM)无法运行在事务中:要运行这样的命令,请启用自动提交模式”是指在Psycopg2中启用自动提交是否只会防止为某些命令(如CREATE DATABASE或VACUUM)创建事务?
谢谢。
1个回答

9
每个PostgreSQL语句都运行在一个事务中。
PostgreSQL本身只知道自动提交模式,这意味着如果您没有明确启动事务,则每个语句将在其自己的事务中运行。
像VACUUM这样的语句不能与其他语句在同一事务中运行。
如果您没有在psycopg2中使用自动提交,则驱动程序必须通过在运行第一个语句时显式启动事务来模拟非自动提交模式。

在PostgreSQL中,当你说“每个PostgreSQL语句都运行在一个事务中”时,它是否仅适用于自动提交?如果禁用自动提交,它是否仍然是“每个PostgreSQL语句都运行在一个事务中”? - Tim
我尝试扩展答案以使其更清晰。如果您在psycopg2中没有设置自动提交模式,则在运行VACUUM和相关命令时可能会出现错误。 DROP DATABASE也是这些命令之一。请注意,这些命令仍然在事务内运行:如果它们失败,它们将不起作用。 - Laurenz Albe
谢谢。PostgreSQL手册说:“CREATE DATABASE不能在事务块内执行。” 事务块是指仅指显式创建的吗?创建数据库是否仍必须在其自己的事务中执行? - Tim
除了 COMMITROLLBACK 是否也可以结束一个事务? - Tim
是的。有关事务管理的基础知识,请阅读文档。 - Laurenz Albe
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接