可以使用psycopg2 (可以是在这里读)执行异步i/o,但是我不确定如何执行异步事务。考虑一下这一系列的事情:
我假设GT1更新与GT2更新冲突。
根据文档的说法
从同一连接创建的游标并不是孤立的,即游标对数据库所做的任何更改都会被其他游标立即看到。
所以我们不能在游标上实现上面的流。我们可以在不同的连接上实现它,但是由于我们正在执行异步操作,那么生成(潜在的)数千个db连接可能是不好的(更不用说Postgres无法处理太多的现成的)。
另一种选择是拥有一个连接池并重用它们。但是,如果我们发出X并行事务,所有其他绿色线程都会被阻塞,直到某些连接可用为止。因此,有用的绿色线程的实际数量是~X (假设应用程序有严重的db绑定),这就提出了一个问题:为什么我们一开始就使用异步?
现在,这个问题实际上可以推广到DBAPI2.0。也许真正的答案是DBAPI2.0不适合异步编程?那么,我们将如何在Postgresql上执行异步操作呢?或者其他图书馆?
或者可能是因为postgresql协议实际上是同步的?能够在任何时候(每个连接)“写入”任何事务都是完美的。Postgresql必须公开事务的id。是可行的吗?也许两阶段提交才是答案?
还是我在这里漏掉了什么?
编辑:--这似乎是BEGIN; COMMIT;的一个普遍问题,因为BEGIN; COMMIT;语义不能有效地异步使用。
发布于 2016-08-03 13:05:06
实际上,您可以在异步中使用BEGIN;和COMMIT;。您需要的是一个连接池设置,并确保每个绿色线程都有自己的连接(就像多线程应用程序中的真正线程一样)。
您不能使用内核2的内置事务处理。
https://stackoverflow.com/questions/38742954
复制相似问题