簡體   English   中英

Python異步事務psycopg2

[英]Python async transactions psycopg2

可以使用psycopg2進行異步i / o(可在此處閱讀 )但是我不知道如何進行異步事務。 考慮這一系列事物:

  • 綠色線程1啟動事務T.
  • GT1發布更新
  • GT2發布一個事務更新
  • GT1發布更新
  • GT1提交事務T.

我假設GT1更新與GT2更新沖突。

現在根據文檔

從同一連接創建的游標不是孤立的,即游標對數據庫所做的任何更改都會被其他游標立即看到。

所以我們無法在游標上實現上面的流程。 我們可以在不同的連接上實現它,但是因為我們正在進行異步,所以產生(可能)數千個db連接可能是壞的(更不用說Postgres無法處理這么多開箱即用的)。

另一種選擇是建立一個連接池並重用它們。 但是,如果我們發出X並行事務,則所有其他綠色線程都會被阻塞,直到某些連接可用。 因此,有用的綠色線程的實際數量是~X(假設app嚴重受db限制)這引發了一個問題:為什么我們要使用異步開始?

現在這個問題實際上可以推廣到DB API 2.0。 也許真正的答案是DB API 2.0不適合異步編程? 那么我們如何在Postgresql上做異步io呢? 也許其他一些圖書館?

或者是因為postgresql協議實際上是同步的? 能夠在任何時間(每個連接)“寫入”任何事務是完美的。 Postgresql必須為此公開事務的id。 它可行嗎? 也許兩階段提交就是答案?

或者我在這里遺漏了什么?

編輯:這似乎是自BEGIN; COMMIT;以來SQL的一般問題BEGIN; COMMIT; BEGIN; COMMIT; 語義不能有效地異步使用。

實際上你可以使用BEGIN; 和COMMIT; 與異步。 你需要的是一個連接池設置,並確保每個綠色線程都有自己的連接(就像多線程應用程序中的真實線程一樣)。

你不能使用psycopg2的內置事務處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM