我试图在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()
,它甚至会返回结果。
谁能告诉我我在这里做错了什么?
答案 0 :(得分:1)
执行SELECT ... INTO
后调用cursor或connection的提交功能,例如:
...
dbCursor.execute(query)
dbCursor.commit()
或者,可以在使用autocommit创建连接时指定事务的自动提交。请注意,autocommit
是connect函数的参数,而不是连接字符串属性,例如:
...
dbCxn = db.connect(cxnString, autocommit=True)
...