单元测试PostgreSQL行级锁

时间:2012-01-14 08:38:17

标签: unit-testing postgresql transactions rowlocking

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

某些过程执行明确锁定行的操作。这些锁对应用程序至关重要。

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

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

(注意:使用PostgreSQL 9.1)

2 个答案:

答案 0 :(得分:1)

如果您可以识别相关行的ctid,并知道哪些事务应该锁定行,那么您可以使用pageinspect扩展并查看元组信息标志和xmax吗?信息标志应指示行被锁定,xmax设置为持有它的事务ID。

答案 1 :(得分: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查询if   我们没有这样做。)

另一方面 - 我完全不明白你为什么要测试锁的存在 - 它是在成功的LOCK命令后保证的。