2012-01-14 25 views
2

我目前使用pgTap將單元測試添加到相當大量的PostgreSQL存儲過程中。單元測試PostgreSQL行級鎖

一些程序執行,其中明確鎖定行的操作。這些鎖對於應用程序至關重要。

我如何寫檢查需要的行被鎖定已經測試,並且不應該被鎖定的行不?

唯一的「線索」我目前所面對的是pgrowlocks擴展,它允許一個事務,以檢查由其他事務鎖定的行。然而,目前的事務似乎沒有看到自己的鎖,所以我不得不使用一些東西來同步兩個事務,除非我錯了,沒有辦法使用pgTap來做到這一點。

(注:使用PostgreSQL 9.1)

+0

對我來說'pg_locks'確實列出了「我自己的」事務/鎖。 – 2012-01-14 08:41:24

+0

這裏它也是如此,但它並不指示哪些元組被鎖定,這是我想要測試的。 – 2012-01-14 08:43:23

回答

1

如果你能確定有問題的行CTID,並且知道應該有哪些交易的行鎖定,也許你可以使用pageinspect擴展,並期待在元組信息標誌和XMAX?信息標誌應該指示行被鎖定,並且xmax被設置爲保存它的事務id。

0

我如何寫檢查需要的行被鎖定已經測試,並且不應該被鎖定的行不?

打開單獨的轉換,嘗試用NOWAIT鎖定同一行,並捕獲異常。

PostgreSQL不支持自治事務,因此 - 從PgTAP測試中打開單獨的事務,您將不得不求助於dblink或其他類似的擴展。

PS。我發現這個鏈接,其中Robert Haas explains, why row-level tuples are not tracked in pg_locks

(...)未批准元組鎖定在 pg_locks對顯示出來,但他們消失,一旦批准。 (PostgreSQL的甚至會一箇中等大小的SELECT FOR UPDATE查詢,如果 我們不這樣做就用完了鎖表空間 。)

在另一方面 - 我非常不明白你爲什麼要測試鎖的存在 - 在成功的LOCK命令後保證。

+0

謝謝,我也考慮過這個問題,但基本上給我帶來了與使用pgrowlocks擴展相同的問題 - 你如何從PgTAP(或其他單元測試框架)內部做到這一點?對不起,我應該在OP中提到這個選擇。 – 2012-01-14 11:59:29