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

使用SQLAlchemy更新SQL Server表后其他用户无法正常查看数据

问题描述

我通过以下代码连接SQL Server:

import pyodbc
import pandas as pd
import sqlalchemy
from sqlalchemy import create_engine

server = 'server'
database = 'db'
driver = 'driver'
database_con = f'mssql://@{server}/{database}?driver={driver}'

engine = create_engine(database_con)
con = engine.connect()

创建DataFrame并插入数据:

df = pd.DataFrame({'column1':['test'], 'column2':[234],  'column3':[234.56]})
df.to_sql(
            name='A_table',
            con=con,
            if_exists="append",
            index=False
        )

执行后我能通过以下代码正常查询到数据:

query = 'select * from A_table'
data = pd.read_sql_query(query, con)
data

但同事在SQL Server中执行select * from A_table时,耗时超过10分钟仍无结果(表中仅3行3列数据)。是否遗漏了步骤?是否需要提交更新到服务器,或有其他方法确保同事能正常查看数据?

解决方案
  • 显式提交事务:SQLAlchemy的connect()方法默认会开启事务,插入操作完成后未提交的话,其他会话无法看到数据,还可能触发表锁阻塞查询。在插入后添加提交操作:

    df.to_sql(...)
    con.commit()  # 提交事务
    

    也可以用上下文管理器自动管理事务,确保操作完成后自动提交:

    with engine.connect() as con:
        df.to_sql(
            name='A_table',
            con=con,
            if_exists="append",
            index=False
        )
        con.commit()
    
  • 检查事务隔离级别:SQL Server默认隔离级别为READ COMMITTED,未提交的事务修改对其他会话不可见。如果你的连接使用了更高隔离级别(如REPEATABLE READ),可能会持有锁更久。可通过以下语句查看并调整:

    -- 查看当前会话隔离级别
    DBCC USEROPTIONS
    -- 设置为默认的READ COMMITTED级别
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    
  • 关闭闲置连接:长时间未关闭的连接可能占用锁资源,操作完成后记得关闭:

    con.close()
    
  • 排查表锁阻塞:让同事执行以下SQL查看是否存在阻塞进程:

    SELECT 
        blocking_session_id,
        session_id,
        command,
        wait_type,
        wait_time
    FROM sys.dm_exec_requests
    WHERE blocking_session_id <> 0;
    

    如果你的会话ID出现在blocking_session_id列中,说明未提交事务导致了阻塞,提交或回滚事务即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:52:42