将isolation_level添加到apache mod_wsgi服务器上的flask-sqlalchemy应用程序后,图像中的间歇性500内部服务器错误

问题描述 投票:0回答:1

我在flask-sqlalchemy,marshamllow应用程序中使用Apache mod_wsgi,使用pyodbc连接到远程ms sql数据库,最近我被要求添加isolation_level'SNAPSHOT',我使用apply_driver_hacks

class SQLiteAlchemy(SQLAlchemy):
def apply_driver_hacks(self, app, info, options):
    options.update({
        'isolation_level': 'SNAPSHOT',
    })
    super(SQLiteAlchemy, self).apply_driver_hacks(app, info, options)

该项目是为了从ms sql服务器访问图像blob数据并显示在网页上,在添加隔离级别后不久我看到为每几个图像生成的内部错误,执行ctrl + f5显示图像但是还有其他图像没有显示,这是在错误日志mod_wsgi(pid = 10694):处理WSGI脚本pyodbc.ProgrammingError发生异常:('42000',“[42000] [Microsoft] [SQL Server的ODBC驱动程序13] [SQL Server]数据库'testdb'中的事务失败,因为该语句是在快照隔离下运行但事务未在快照隔离中启动。除非事务最初是在快照隔离下启动的,否则您无法在事务启动后将事务的隔离级别更改为快照等级。(3951)(SQLExecDirectW)“)

编辑后添加以下代码:

如果不使用crate-engine,我将如何使用flask-sqlalchemy

我的app.py文件

app = Flask(__name__)
app.config.from_object('config.ProductionConfig')
db.init_app(app)
ma.init_app(app)

我的model.py文件

class SQLiteAlchemy(SQLAlchemy):
def apply_driver_hacks(self, app, info, options):
    options.update({
        'isolation_level': 'SNAPSHOT',
    })
    super(SQLiteAlchemy, self).apply_driver_hacks(app, info, options)

# To be initialized with the Flask app object in app.py.
db = SQLiteAlchemy()
ma = Marshmallow()
flask-sqlalchemy mod-wsgi pyodbc isolation-level
1个回答
0
投票

在引擎级别

如果您使用的是declaritive实现,则可以访问create engine函数(以及作用域的会话)。

但假设您正在使用Flask-SQLAlchemy实现,这只是在引擎盖sqlalchemy.create_engine下调用(on this line)

可能是后者的黑客,因为似乎没有办法通过引擎相关的选项;它们在#558特别定义了几行:

options = {'convert_unicode': True}

在会话级别

这看起来可能稍微容易些,因为您可以在初始化SQLAlchemy时传递会话选项:see this linecreate_scoped_session方法期望a dictionary可以作为__init__传递给session_options方法。

因此,当您初始化库时,您可以尝试以下方法:

db = SQLiteAlchemy(session_options={'isolation_level': 'SNAPSHOT'})
© www.soinside.com 2019 - 2024. All rights reserved.