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

时间:2016-03-08 23:30:29

标签: python sql sql-server pymssql python-db-api

如何为通过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

2 个答案:

答案 0 :(得分:3)

这仅适用于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)

答案 1 :(得分:0)

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

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

一旦在数据库级别启用了隔离级别,就可以设置会话隔离级别。

希望有帮助。