如何在 Sql Alchemy Python 中为 MS SQL 后端指定事务隔离级别

Posted

技术标签:

【中文标题】如何在 Sql Alchemy Python 中为 MS SQL 后端指定事务隔离级别【英文标题】:How do I specify Transaction Isolation Level for MS SQL backend in Sql Alchemy Python 【发布时间】:2016-03-08 23:30:29 【问题描述】:

如何为通过 SQL Alchemy 引擎对象完成的所有查询设置事务级别 READ UNCOMMITED

我将isolation_level 参数设置为如下所示:http://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine.params.isolation_level 像这样将它传递给create_engine

my_eng = create_engine(db_conn_string, isolation_level='READ_UNCOMMITTED')

但是对于我的后端(MS SQL Server),我收到以下错误,这也许并不奇怪,因为文档确实说它是特定于方言的。我很惊讶在 MS SQL 中没有关于隔离级别的文档!

TypeError: Invalid argument(s) 'isolation_level' sent to create_engine(), 
using configuration MSDialect_pyodbc/QueuePool/Engine.  Please check that 
the keyword arguments are appropriate for this combination of components.

此外,我在这里的方言文档中看不到任何有用的信息:

http://docs.sqlalchemy.org/en/rel_1_0/dialects/mssql.html#dsn-connections

【问题讨论】:

不是没有,但你能更新你的帖子,告诉你如何称呼create_engine()吗? 好点本,更新了。 【参考方案1】:

这仅在 SQL Alchemy 的 beta(预发布)版本(当前为 1.1.0b2)中可用。否则,当前版本 (1.0.14) 没有此功能。如果你真的想使用这个功能,你可以像这样安装预发布版本:

pip install --pre --upgrade sqlalchemy

来源:http://docs.sqlalchemy.org/en/latest/intro.html#install-via-pip

另一种解决方案是直接发出以下 SQL 命令:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  

来源:https://msdn.microsoft.com/en-us/library/ms173763.aspx

在 SQL Alchemy 中实现后者的一种方法是:

query = 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'
session.connection().connection.execute(query)

【讨论】:

【参考方案2】:

我注意到这是一篇旧帖子,但想知道这个问题的答案是否是确保在数据库级别打开正确的隔离级别

ALTER DATABASE MyDatabase 设置 ALLOW_SNAPSHOT_ISOLATION

ALTER DATABASE MyDatabase 设置 READ_COMMITTED_SNAPSHOT 开启

https://docs.microsoft.com/en-au/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server

在数据库级别启用隔离级别后,您可以设置会话隔离级别。

希望对您有所帮助。

【讨论】:

以上是关于如何在 Sql Alchemy Python 中为 MS SQL 后端指定事务隔离级别的主要内容,如果未能解决你的问题,请参考以下文章