You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pyodbc执行INSERT语句无限挂起无返回,请求技术排查

问题排查与解决方法

1. 修正INSERT语句的语法错误

你的INSERT语句存在明显语法问题,这是导致执行异常的核心原因:

  • SQL Server的INSERT标准语法为 INSERT INTO 表名 (列名1, 列名2) VALUES (值1, 值2)
  • 你的代码把列定义和值列表的格式搞混,且参数占位符错误(pyodbc对SQL Server的占位符是?,不需要加数字前缀)

修正后的代码:

test = cursor.execute("INSERT INTO myname.MYTABLE (ObjectID, GlobalID) VALUES (?, ?)", y, z)

2. 排查数据库锁阻塞情况

未提交的事务可能持有锁,导致INSERT请求被阻塞:

  • 远程登录SQL Server服务器,打开SQL Server Management Studio (SSMS)
  • 执行以下查询查看当前阻塞会话:
    SELECT 
        session_id, 
        blocking_session_id, 
        wait_type, 
        wait_time, 
        text AS sql_text
    FROM sys.dm_exec_requests
    CROSS APPLY sys.dm_exec_sql_text(sql_handle)
    WHERE blocking_session_id <> 0;
    
  • 若发现INSERT会话被其他会话阻塞,找到对应的blocking_session_id,确认业务影响后终止该会话:
    KILL [blocking_session_id];
    

3. 检查连接的事务隔离级别

默认隔离级别可能导致锁持有时间过长,可显式设置为SQL Server默认的读提交级别:

import pyodbc

conn = pyodbc.connect(db_str)
conn.set_attr(pyodbc.SQL_ATTR_TXN_ISOLATION, pyodbc.SQL_TXN_READ_COMMITTED)

4. 最小化INSERT测试

先用常量值执行INSERT,排除参数类型或约束问题:

cursor = conn.cursor()
cursor.execute("INSERT INTO myname.MYTABLE (ObjectID, GlobalID) VALUES ('test_obj', 'test_global')")
print("INSERT执行完成")

如果这一步正常,说明之前的y/z参数可能存在类型不匹配、值超长或违反主键/唯一约束等问题,需核对表结构与参数值。

5. 启用pyodbc调试日志

通过日志定位执行细节:

import pyodbc
import logging

pyodbc.set_logging_level(logging.DEBUG)
# 之后执行连接与INSERT操作,查看控制台日志排查阻塞点

内容的提问来源于stack exchange,提问作者woshtechguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:48:16