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

Django连接SQL Server更新时报Could not change transaction status错误求助

解决思路

1. 排查未收尾的事务逻辑

  • 检查代码中是否存在未正确结束的事务块:比如transaction.atomic()包裹的代码如果抛出异常未被捕获,会导致事务挂起,此时修改autocommit状态会触发错误。
  • 除了connection.rollback(),可以尝试在触发错误前执行connection.close()强制断开连接(Django会自动重建新连接),看是否能解除阻塞。

2. 升级依赖库版本

  • django-pyodbc-azure旧版本在处理autocommit切换时可能存在bug,建议升级到最新稳定版:
    pip install --upgrade django-pyodbc-azure
    
  • 同时确认FreeTDS版本与SQL Server兼容:比如SQL Server 2016及以上建议使用FreeTDS 1.3+版本。

3. 调整数据库连接配置

  • 在settings.py的数据库配置中,明确指定TDS版本并确保autocommit配置生效:
    DATABASES = {
        'default': {
            'ENGINE': 'sql_server.pyodbc',
            'NAME': '你的数据库名',
            'USER': '用户名',
            'PASSWORD': '密码',
            'HOST': '远程服务器地址',
            'PORT': '1433',
            'OPTIONS': {
                'driver': 'FreeTDS',
                'TDS_VERSION': '7.4',  # 根据SQL Server版本调整,2016+用7.4
                'autocommit': True,
                'MAX_CONN_AGE': 0,  # 关闭连接池,避免复用异常连接
            },
        }
    }
    

4. 显式控制事务边界

  • 避免频繁切换autocommit状态,统一用Django的事务管理工具控制:
    from django.db import transaction
    
    def update_data():
        try:
            # 执行更新操作
            YourModel.objects.filter(id=1).update(status='updated')
            transaction.commit()
        except Exception:
            transaction.rollback()
            raise
    

5. 检查SQL Server端活跃事务

  • 在SQL Server执行以下查询,查看是否有挂起的事务:
    SELECT 
        transaction_id, 
        transaction_begin_time, 
        session_id
    FROM sys.dm_tran_active_transactions
    WHERE session_id != @@SPID;
    
  • 若发现长期未结束的事务,可手动终止对应会话(注意影响范围):
    KILL [session_id];
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:10:37