2009-10-30 18 views
14

我在PostgreSQL上有一個會話(SQLAlchemy),具有一個活動的未提交事務。我剛剛通過會話到一些呼叫樹,可能或可能不會發布SQL INSERT/UPDATE/DELETE報表,通過sqlalchemy.orm或直接通過底層連接。如何檢查PostgreSQL事務中的掛起操作

有沒有辦法來檢查這個事務中是否有任何待處理的數據修改語句?即提交是否是無操作,以及回滾是否會丟棄某些內容?

我見過人們在Oracle中指出v$transaction同樣的事情(請參閱this SO question)。我正在尋找類似於PostgreSQL上使用的東西。

回答

0

不,不是從數據庫級的,真的。也許你可以在sqlalchemy級別添加一些跟蹤來跟蹤它?

另外,你如何定義一個無操作?如果您將價值更新爲與之前相同的價值,那該怎麼辦?從數據庫的角度來看,如果它有一個,它不會是一個無效的。但從應用的角度來看,它可能會。

+0

當然,冗餘寫入也是「無操作」,但我不希望檢測到這種情況(成本高於價值)。我只想知道事務是否有任何寫或刪除操作,無效或無效。 – 2009-11-01 00:50:45

2

考慮語句順序如下:

select txid_current(); 

begin; 

select txid_current(); 

如果兩個選擇返回事務ID相等,則有打開的事務。如果不是,那麼沒有,(但現在是)。

如果數字不同,那麼作爲副作用,您只需打開一個您可能想要關閉的事務。

UPDATE:事實上,正如@ r2evans指出(感謝您的洞察力!),你不需要在「開始」 - txid_current()將返回相同數量的只是,如果你是在一個事務中。

+0

也許你不需要'begin':如果你連續兩次查詢select'txid_current();',如果它們返回的數字與你當前在事務中的數量相同。 – r2evans 2017-12-20 21:36:11