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

