Unit testing 单元测试PostgreSQL行级锁

Unit testing 单元测试PostgreSQL行级锁,unit-testing,postgresql,transactions,rowlocking,Unit Testing,Postgresql,Transactions,Rowlocking,我目前正在使用pgTap向大量PostgreSQL存储过程中添加单元测试 某些过程执行显式锁定行的操作。这些锁对应用程序至关重要 如何编写测试来检查需要锁定的行是否已锁定,以及不应该锁定的行是否未锁定 目前我唯一的“线索”是pgrowlocks扩展,它允许一个事务检查被另一个事务锁定的行。然而,当前事务似乎看不到它自己的锁,所以我必须使用一些东西来同步两个事务,除非我完全弄错了,否则使用pgTap是无法做到这一点的 (注:使用PostgreSQL 9.1) 如何编写测试来检查需要锁定的行是否已锁

我目前正在使用pgTap向大量PostgreSQL存储过程中添加单元测试

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

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

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

(注:使用PostgreSQL 9.1)

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

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

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

另外,我找到了这个链接,其中:

(…)未命名的元组锁显示在 pg_锁,但一旦授予,它们就会消失。(PostgreSQL将耗尽 即使是中等大小的SELECT FOR UPDATE查询,如果 我们没有这样做。)


另一方面,我很不理解为什么要测试锁的存在性,成功的lock命令后就可以保证它的存在。

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

对于我来说
pg_locks
确实列出了“我自己的”事务/锁。在这里它也会列出,但它不指示锁定了哪些元组,这是我想要测试的。谢谢,我也考虑过这一点,但它基本上给我留下了与使用pgrowlocks扩展相同的问题-如何从PgTAP(或其他单元测试框架)内部做到这一点?对不起,我应该在行动中提到这个选择。