问题" IF @@ TRANCOUNT> 0 COMMIT TRAN"

时间:2014-12-01 22:17:54

标签: python sql-server flask sqlalchemy

我正在构建一个Flask应用程序,其中SQLAlchemy用于查询,SQL Server用于数据库存储。最近我注意到在SQL Server Activity Monitor中有很多开放会话看起来像这样:

capture

我做了一些搜索,却找不到任何理由。我想知道是否有人知道是什么导致了这个问题?

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

是否可能由我的代码结构引起?

这就是我定义会话连接的方式(使用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()

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

1 个答案:

答案 0 :(得分:0)

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

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