【问题标题】:pyodbc locks tables and takes too long to runpyodbc 锁表,运行时间过长
【发布时间】:2013-05-12 20:43:01
【问题描述】:

我有一个 python 脚本可以将文件从 SFTP 站点下载到本地文件夹,然后使用下载的文件运行存储过程。第一个方面运行良好。但随后执行存储过程会导致 SQL 服务器上的其他表被锁定 - 返回“超时已过期”错误。该程序已经运行了一个半小时。

这是我用于执行存储过程的语法,以防有人想知道:

conn = pyodbc.connect('DRIVER={SQLServer};SERVER=localhost;DATABASE=Db;UID=myid;PWD=mypwd')
cursor = conn.cursor()

cursor.execute("""exec SP_Upsert_Y ?""",sfile)
cursor.commit()

【问题讨论】:

  • 在 SQL Sever 中以本机方式运行该过程是否需要很长时间?以这种方式运行时是否也会锁定数据库?
  • 不,当我在 sql server 中直接运行存储过程时,它会在一分钟或更短的时间内执行,并且不会锁定数据库。
  • 程序是做什么的?它是BULK INSERT 文件还是类似的东西?如果是这样,您的 Python 代码是否可能尚未发布该文件?您还多次提到锁定,您是如何观察到锁定导致问题的?您是否使用过 SQL Profiler 来观察过程的执行?提及 SQL Server、Python 和 pyodbc 的版本也可能会有所帮助。
  • 嗨 Pondlife。是的,存储过程将文件批量插入到临时表中,进行一些修剪,然后插入到永久表中。我提到了锁定,因为当我尝试访问某些表时,我收到错误“超过锁定请求超时时间”。我正在使用 SQL Server 2012、python 2.7 和最新版本的 pyodbc(我已经简单安装了它——不记得确切的版本是什么)。谢谢
  • 如果可能,请发布存储过程的代码以及 SQL Profiler 发生的情况

标签: python sql-server pyodbc


【解决方案1】:

我有同样的问题,你解决了将参数autocommit=True添加到连接字符串

【讨论】:

  • same here... 通过 PYODBC 执行存储过程会导致相关表被锁定,直到整个过程完成。从 SSMS 运行存储过程时没有问题,锁定按预期进行管理(仅在短事务期间锁定)。设置 autocommit=True 会改变类似于 SSMS 的行为。
猜你喜欢
  • 2015-07-17
  • 1970-01-01
  • 2020-04-16
  • 2018-04-07
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2023-03-18
相关资源
最近更新 更多