如何让 pyodbc 在不锁定的情况下执行"SELECT ... INTO"语句?



我正在尝试在SQL Server中复制一个表,但是在使用pyodbc时,一个简单的语句似乎锁定了我的数据库。这是我正在尝试的代码:

dbCxn = db.connect(cxnString)
dbCursor = dbCxn.cursor()
query = """
SELECT TOP(10) *
INTO production_data_adjusted
FROM production_data
"""
dbCursor.execute(query)

最后一条语句立即返回,但之后 LINQPad 和 SQL Server Management Studio 都被锁定在数据库之外(我尝试刷新它们的表列表)。运行sp_who2显示 LINQPad/SSMS 卡住了等待我的 pyodbc 进程。服务器上的其他数据库看起来很好,但对此数据库的所有访问都会被阻止。我可以让这些其他应用程序解决其停滞的唯一方法是关闭 pyodbc 数据库连接:

dbCxn.close()

这个完全相同的SELECT ... INTO语句语句工作正常,从 LINQPad 和 SSMS 只需一秒钟。上面的代码工作正常,如果我删除INTO行,就不会锁定数据库。如果我添加fetchone()fetchall(),它甚至会返回结果。

谁能告诉我我在这里做错了什么?

在执行 SELECT ... INTO 后调用游标或连接的 commit 函数,例如:

...
dbCursor.execute(query)
dbCursor.commit()

或者,可以在使用自动提交创建连接时指定事务的自动提交。请注意,autocommit 是连接函数的参数,而不是连接字符串属性,例如:

...
dbCxn = db.connect(cxnString, autocommit=True)
...

相关内容

  • 没有找到相关文章

最新更新