Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何调试Postgres中的ShareLock_Postgresql - Fatal编程技术网

Postgresql 如何调试Postgres中的ShareLock

Postgresql 如何调试Postgres中的ShareLock,postgresql,Postgresql,在我的Postgres服务器日志中,我看到了很多以下情况: LOG: process x still waiting for ShareLock on transaction y after 1000.109 ms DETAIL: Process holding the lock: z. Wait queue: x. CONTEXT: while inserting index tuple (a,b) in relation "my_test_table" SQL functio

在我的Postgres服务器日志中,我看到了很多以下情况:

LOG:  process x still waiting for ShareLock on transaction y after 1000.109 ms 
DETAIL:  Process holding the lock: z. Wait queue: x.
CONTEXT:  while inserting index tuple (a,b) in relation "my_test_table"
    SQL function "my_test_function" statement 1 
...
LOG:  process x acquired ShareLock on transaction y after 1013.664 ms
CONTEXT:  while inserting index tuple (a,b) in relation "my_test_table"
我正在参加博士后9.5.3。此外,我在Heroku上运行,因此无法访问细粒度的超级用户专用调试工具

考虑到这些约束条件以及每个锁都是相对瞬态的(通常为1000-2000ms),我想知道如何最好地调试这样的问题

我尝试过的事情:

  • 监控(并连接到上下文)
  • 调查
  • 在本地手动复制和使用超级用户烫发。到目前为止,我无法在本地复制该问题(我怀疑是因为数据集小得多,但我不能确定)

值得注意的是,当我看到这些问题时,CPU利用率似乎很高(负载平均值>1),因此上述问题本身可能没有问题,我认为这是可用系统资源不足的结果。尽管如此,我仍然想了解如何最好地调试它,以便能够了解到底发生了什么。

关键是它是事务的共享锁

这意味着一个事务正在等待另一个事务提交/回滚,然后才能继续。这只是一个松散的“锁”。这里发生的情况是,PostgreSQL事务在启动时在其自己的事务ID上采用了ExclusiveLock。希望等待其完成的其他事务可以尝试获取事务的共享锁,该共享锁将被阻止,直到提交/中止时释放ExclusiveLock。它基本上是使用锁定机制来方便地实现事务间完成信令

这通常发生在等待的事务试图为等待的事务最近插入/修改的行插入
唯一的
主键的值时。等待的事务在知道等待的事务的结果之前无法继续,不管它是提交还是回滚,如果它提交,目标行是否被删除/插入/无论什么

这与错误消息中的内容一致。proc“x”正试图插入到“my_test_table”中,并且必须等到proc“y”提交xact“z”后,才能确定是否引发唯一冲突,或者是否可以继续


最有可能的情况是,在某种upsert或队列处理系统中存在争用。如果您有一些函数/事务模式试图插入到一个竞争激烈的表中,然后在它提交之前做很多其他耗时的工作,那么也可能发生这种情况。

在这种情况下,您找到了避免死锁的方法吗?| | | | | | | | | | | | | | | | | | | | | | | | |||