0

我有一些 python 代码,我试图使用 sqlalchemy 和 modin 从我的数据库中并行读取未提交的代码。我尝试将函数调用为:df = pd.read_sql("select * from my_table", uri_string, params={'isolation_level': 'READ UNCOMMITTED'}). 但是,我看到生成的查询在没有隔离级别的情况下提交到我的数据库。有没有人能够在调用 read_sql 之前在不创建 sqlalchemy 引擎的情况下注入隔离级别?

编辑:与 pandas 不同,modin 的实现允许 read_sql 并行运行。该实现的一部分意味着我编写的任何查询都将被包装到几个子查询中,例如select * from (select * from my_table) limit 100 offset 200;. 因此,在不调整此实现的情况下,语句级隔离是不可能的。此外,此实现需要一个 sqlalchemy URI 字符串,而不是可以由许多工作人员序列化的引擎或连接。因此,如果要从连接字符串设置隔离级别,我需要知道如何在 URI 字符串中注入隔离级别参数。

4

1 回答 1

0

Db2-LUW 的每个数据库事务都有一个隔离级别,无论您是否明确表示它 - 总是有一些默认值。但是,如果您连接到 Db2-for-i (as/400),这可能不是真的。

您可以选择更改隔离级别的方式和位置。

对于偶尔的查询,您可以使用语句级隔离(只要工具允许),其中 SELECT 语句本身附加了一个可选子句,以仅指定该语句的隔离。例如select whatever from table where... with UR (未提交的读取)。

如果您希望所有动态 SQL 语句都具有相同的隔离级别(这是有意义的),那么您可以在连接到数据库时指定隔离。对于使用 CLI 接口的 python(即 cpython),您可以在连接字符串;TxnIsolation=1;(对于 UR)上使用 CLI 设置,或者通过参数db2dsdriver.cfgdb2cli.ini(如果使用)中的数据源定义IsolationLevel=...。更多细节在这里

如果您(直接或间接地)使用绑定了特定隔离级别的静态包调用任何 Db2 例程,那么这将覆盖您之前可能已设置的任何其他设置,因此请注意。

于 2021-07-23T19:06:36.707 回答