为什么没有自动提交功能意味着所有查询都在PostgreSQL的事务中执行?

时间:2018-08-15 12:12:46

标签: python postgresql psycopg2

来自https://wiki.postgresql.org/wiki/Psycopg2_Tutorial

  

PostgreSQL没有自动提交功能,这意味着所有   查询将在交易中执行。

     

在事务中执行是一件好事,它可以确保数据   完整性,并允许适当的错误处理。但是有   无法在交易中运行的查询。拿   以下示例。

#/usr/bin/python2.4
#
#

import psycopg2

# Try to connect

try:
    conn=psycopg2.connect("dbname='template1' user='dbuser' password='mypass'")
except:
    print "I am unable to connect to the database."

cur = conn.cursor()
try:
    cur.execute("""DROP DATABASE foo_test""")
except:
    print "I can't drop our test database!"
     

此代码实际上会失败,并显示“我不能   删除我们的测试数据库!“ PostgreSQL无法删除   交易,它是全有或全无的命令。 如果要删除   数据库,您将需要更改数据库的隔离级别   这是通过以下操作完成的。

conn.set_isolation_level(0)
     

您应将以上内容放在DROP DATABASE的紧前面   光标执行。

我想知道为什么

  • “ PostgreSQL没有自动提交功能,这意味着所有查询都将在事务中执行。”

  • “ PostgreSQL无法删除事务中的数据库”

  • “如果要删除数据库,则需要更改数据库的隔离级别”

谢谢。


更新: What does autocommit mean in postgresql and psycopg2?回答我的问题

1 个答案:

答案 0 :(得分:1)

这3个都与Python及其数据库连接器库有关,与PostgreSQL本身无关:

  1. PostgreSQL有一个autocommit,默认情况下它是活动的-这意味着每个SQL语句都将立即执行。启动事务块时,将禁用此自动提交模式,直到您完成事务(通过COMMIT或ROLLBACK)
  2. 销毁数据库的操作无法在事务块内部运行。还请记住,与大多数其他数据库不同,PostgreSQL允许几乎所有DDL语句(显然不是DROP DATABASE语句)都可以在事务内执行。
  3. 实际上,如果任何人(包括您)当前已连接到该数据库,则您不能删除该数据库-因此,无论您的隔离级别是什么,您仍然必须连接到另一个数据库(例如postgres