2

我目前正在使用 pgTap 将单元测试添加到相当大量的 PostgreSQL 存储过程中。

一些过程执行显式锁定行的操作。这些锁对应用程序至关重要。

如何编写测试来检查需要锁定的行是否已锁定,以及不应锁定的行是否已锁定?

我目前唯一的“线索”是 pgrowlocks 扩展,它允许事务检查被另一个事务锁定的行。但是,当前事务似乎没有看到它自己的锁,所以我不得不使用一些东西来同步两个事务,除非我完全弄错了,否则使用 pgTap 没有办法做到这一点。

(注意:使用 PostgreSQL 9.1)

4

2 回答 2

1

如果您可以识别有问题的行的 ctid,并且知道哪个事务应该锁定行,也许您可​​以使用 pageinspect 扩展并查看元组信息标志和 xmax?信息标志应指示该行已锁定,并将 xmax 设置为持有它的事务 id。

于 2012-01-14T13:44:40.203 回答
0

如何编写测试来检查需要锁定的行是否已锁定,以及不应锁定的行是否已锁定?

打开单独的事务,尝试用NOWAIT锁定同一行,并捕获异常。

PostgreSQL 不支持自治事务,因此 - 要从 PgTAP 测试中打开单独的事务,您将不得不求助于dblink或其他类似的扩展。

PS。我找到了这个链接,Robert Haas 解释了为什么在 pg_locks 中不跟踪行级元组

(...) 未授予的元组锁出现在 pg_locks 中,但一旦授予它们就会消失。(如果我们不这样做,即使是中等规模的 SELECT FOR UPDATE 查询,PostgreSQL 也会用完锁表空间。)

另一方面 - 我很不明白你为什么要测试锁的存在 - 在成功的 LOCK 命令之后得到保证。

于 2012-01-14T11:44:12.180 回答