【问题标题】:Trouble with "IF @@TRANCOUNT > 0 COMMIT TRAN"“IF @@TRANCOUNT > 0 COMMIT TRAN”出现问题
【发布时间】:2015-01-30 01:10:27
【问题描述】:

我正在使用用于查询的 SQLAlchemy 和用于数据库存储的 SQL Server 构建 Flask 应用程序。最近我注意到在 SQL Server 活动监视器中有很多打开的会话看起来像这样:

我进行了一些搜索,但找不到任何原因。不知道有没有人知道是什么原因造成的?

注意:在某些背景下,直接在 Flask 上下文下管理的请求似乎没问题(因此在网站上单击并运行查询不会导致这种情况)。仅当我运行后端 Celery 任务时才会发生这种情况。

可能是我的代码结构造成的吗?

这就是我定义会话连接的方式(使用 scoped_session):

engine = create_engine('connection string here')
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: python sql-server flask sqlalchemy


    【解决方案1】:

    我认为您的应用程序中正在发生的事情是,您编写了一些代码来执行类似 ....

    BEGIN TRANSACTION 
    
     -- Some code here 
    
    
    IF @@TRANCOUNT > 0 
     BEGIN
       COMMIT TRANSACTION;
     END
    

    但是如果您打开事务后的代码没有影响任何行呢?

    您还没有提交它,这是有道理的,因为没有要提交的更改,但您留下了一个 OPEN TRANSACTION。

    你的代码应该看起来像这样......

    BEGIN TRANSACTION 
    
     -- Some code here 
    
    
    IF @@TRANCOUNT > 0 
     BEGIN
       COMMIT TRANSACTION;
     END
    ELSE
     BEGIN
       ROLLBACK TRANSACTION;
     END
    

    【讨论】:

    • 恐怕我没有这样的代码,要么是在 ORM 模型中完成,要么只是一些直接的 SELECTUPDATE 查询......而且我已经检查了所有UPDATE 提交使用 db_session.commit()SELECT 查询使用 fetchall() 解析。
    • 如果你没有这样的代码,那么 SQL Server Activity Monitor 一定是在骗你:)
    • 我有一个非常相似的任务,但是我没有使用 celery 来安排任务,而是使用了 Windows 计划任务,这不会导致这个问题。奇怪...可能需要多挖一点..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2015-06-24
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多