Python 异步事务 psycopg2
Python async transactions psycopg2
可以使用 psycopg2(可以是 read here)执行异步 i/o,但是我不确定如何执行异步事务。考虑这一系列事情:
- 绿色线程 1 启动事务 T
- GT1 发布更新
- GT2 发布一个交易更新
- GT1 发布更新
- GT1 提交事务 T
我假设 GT1 更新与 GT2 更新冲突。
现在根据docs:
Cursors created from the same connection are not isolated, i.e., any
changes done to the database by a cursor are immediately visible by
the other cursors.
所以我们不能在游标上实现上面的流程。我们可以在不同的连接上实现它,但由于我们正在进行异步操作,因此产生(可能)数千个数据库连接可能很糟糕(更不用说 Postgres 无法立即处理这么多)。
另一种选择是拥有一个连接池并重用它们。但是如果我们发出 X 个并行事务,所有其他绿色线程都会被阻塞,直到某个连接可用。因此,有用的绿色线程的实际数量是 ~X(假设应用程序是严重的数据库绑定),这引发了一个问题:我们为什么要使用异步开始?
现在这个问题实际上可以推广到 DB API 2.0。也许真正的答案是 DB API 2.0 不适合异步编程?那么我们如何在 Postgresql 上执行异步 io?也许是其他图书馆?
或者是因为 postgresql 协议实际上是同步的?如果能够在任何时间(每个连接)"write" 进行任何交易,那将是完美的。 Postgresql 必须为此公开事务的 ID。可行吗?也许两阶段提交是答案?
还是我遗漏了什么?
编辑: 这似乎是 SQL 的普遍问题,因为 BEGIN; COMMIT;
语义不能有效地异步使用。
其实你可以使用BEGIN;并提交;与异步。您需要的是连接池设置,并确保每个绿色线程都有自己的连接(就像多线程应用程序中的真实线程一样)。
您不能使用 psycopg2 的内置事务处理。
可以使用 psycopg2(可以是 read here)执行异步 i/o,但是我不确定如何执行异步事务。考虑这一系列事情:
- 绿色线程 1 启动事务 T
- GT1 发布更新
- GT2 发布一个交易更新
- GT1 发布更新
- GT1 提交事务 T
我假设 GT1 更新与 GT2 更新冲突。
现在根据docs:
Cursors created from the same connection are not isolated, i.e., any changes done to the database by a cursor are immediately visible by the other cursors.
所以我们不能在游标上实现上面的流程。我们可以在不同的连接上实现它,但由于我们正在进行异步操作,因此产生(可能)数千个数据库连接可能很糟糕(更不用说 Postgres 无法立即处理这么多)。
另一种选择是拥有一个连接池并重用它们。但是如果我们发出 X 个并行事务,所有其他绿色线程都会被阻塞,直到某个连接可用。因此,有用的绿色线程的实际数量是 ~X(假设应用程序是严重的数据库绑定),这引发了一个问题:我们为什么要使用异步开始?
现在这个问题实际上可以推广到 DB API 2.0。也许真正的答案是 DB API 2.0 不适合异步编程?那么我们如何在 Postgresql 上执行异步 io?也许是其他图书馆?
或者是因为 postgresql 协议实际上是同步的?如果能够在任何时间(每个连接)"write" 进行任何交易,那将是完美的。 Postgresql 必须为此公开事务的 ID。可行吗?也许两阶段提交是答案?
还是我遗漏了什么?
编辑: 这似乎是 SQL 的普遍问题,因为 BEGIN; COMMIT;
语义不能有效地异步使用。
其实你可以使用BEGIN;并提交;与异步。您需要的是连接池设置,并确保每个绿色线程都有自己的连接(就像多线程应用程序中的真实线程一样)。
您不能使用 psycopg2 的内置事务处理。