【问题标题】:Unit-testing PostgreSQL row-level locks单元测试 PostgreSQL 行级锁
【发布时间】:2012-01-14 08:38:16
【问题描述】:

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

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

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

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

(注意:使用 PostgreSQL 9.1)

【问题讨论】:

  • 对我来说 pg_locks 确实列出了“我自己的”交易/锁。
  • 这里也是这样,但是并没有指出哪些元组被锁定,这是我要测试的。

标签: unit-testing postgresql transactions rowlocking


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    打开单独的事务,尝试用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 命令之后得到保证。

    【讨论】:

    • 谢谢,我也考虑过这个,但它基本上给我留下了与使用 pgrowlocks 扩展相同的问题 - 你如何从 PgTAP(或其他一些单元测试框架)中做到这一点?对不起,我应该在 OP 中提到这个替代方案。
    猜你喜欢
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2012-10-06
    • 2016-10-27
    • 1970-01-01
    相关资源
    最近更新 更多