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
相关产品推荐
相关产品推荐

