2012-01-14 72 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