我怎样才能让pyodbc执行一个" SELECT ... INTO"声明没有锁定?

时间:2014-11-14 02:46:08

标签: sql-server pyodbc

我试图在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(),它甚至会返回结果。

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

1 个答案:

答案 0 :(得分:1)

执行SELECT ... INTO后调用cursorconnection的提交功能,例如:

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

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

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