【问题标题】:Python queries are getting gridlocked on SQL ServerPython 查询在 SQL Server 上陷入僵局
【发布时间】:2018-01-18 21:40:27
【问题描述】:

我正在尝试自动化每个月初运行的大型数据库进程。目前,这是通过数据库中已经存在的一堆存储过程完成的。我目前的任务是让这些存储过程通过 Python 的 pyodbc 运行。

这些存储过程的棘手之处在于我需要一次运行它们,这样它们就不会占用数据库的所有资源。因此,为了检查存储过程是否已运行,我创建了一个已更新的表,将过程开头的名为“IsFinished”的标志更改为False,最后更改为True

当我再次尝试查询数据库时出现问题。 SQL Server 中的活动监视器显示我对 Tracking 表的查询为 SUSPENDED 并被存储过程调用阻止。

我什至创建了一个新数据库,以便我可以独立调用这两个数据库,以进一步确保我没有在争夺资源……但我仍在争夺资源。

我正在使用 Python 3.6.4 和 pyodbc 模块。这是我的代码。需要注意的是connect_db_1()connect_db_2()指向两个独立的数据库。

conn = connect_db_1()

conn.execute("{call dbo.StoredProcedure}")

conn2 = connect_db_2()

start_time = time.time()

finished = False

while finished is False:
    print("Looping")
    time.sleep(120)
    cursor = conn2.execute(
        "SELECT IsFinished from dbo.Tracking where StoredProcedureName='dbo.StoredProcedure'")
    results = cursor.fetchall()
    if results[0][0] == True:
        finished = True
    print(results)
print(f"dbo.StoredProcedure finished in {time_diff(start_time)} seconds.")
cursor.close()

编辑:添加了我的代码的净化版本。

【问题讨论】:

  • 你能展示一些你的python代码吗?您可能正在锁定从 python 端到 DB 的连接。
  • @Anil_M 刚刚添加了我的代码 - 仅更改了表名,并且删除了 try/excepts。
  • 为什么不使用 SQL Server 作业代理?
  • 在运行脚本之前需要进行大量文件操作。文件操作也需要自动化,因此需要 Python。

标签: python sql-server python-3.x pyodbc


【解决方案1】:

您想在循环中关闭光标,因为您正在循环中创建新光标。

基本上,您会一遍又一遍地打开光标而没有关闭。

while finished is False:
    print("Looping")
    time.sleep(120)
    cursor = conn2.execute(
        "SELECT IsFinished from dbo.Tracking where StoredProcedureName='dbo.StoredProcedure'")
    results = cursor.fetchall()
    if results[0][0] == True:
        finished = True
    print(results)
    cursor.close()
print(f"dbo.StoredProcedure finished in {time_diff(start_time)} seconds.")

【讨论】:

  • 这是一个很好的观点,但应该指出光标没有执行一次。这绝对是我需要在代码中进行的修复,但这并不能解决我的数据库中的死锁问题。僵局发生在第一个conn2.execute()
猜你喜欢
  • 1970-01-01
  • 2022-07-14
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多