Sql ShareLock和ExclusiveLock与postgres数据库

Sql ShareLock和ExclusiveLock与postgres数据库,sql,ruby-on-rails,postgresql,auto-increment,delayed-job,Sql,Ruby On Rails,Postgresql,Auto Increment,Delayed Job,我正在检查一个在heroku中运行的应用程序的锁日志,它显示了来自延迟的_作业和增量_计数器的很多锁,这一次我也得到了很多超时 sql_error_code = 00000 LOG: process 129728 still waiting for ShareLock on transaction 1296511670 after 1000.149 ms 2017-06-02T16:24:58+00:00 app postgres.129728 - - [TEST] [7-2] sql_e

我正在检查一个在heroku中运行的应用程序的锁日志,它显示了来自延迟的_作业和增量_计数器的很多锁,这一次我也得到了很多超时

sql_error_code = 00000 LOG: process 129728 still waiting for ShareLock on 
transaction 1296511670 after 1000.149 ms

2017-06-02T16:24:58+00:00 app 
postgres.129728 - - [TEST] [7-2] sql_error_code = 00000 DETAIL: Process
holding the lock: 129457. Wait queue: 129728.

02 Jun 2017 20:24:58.338198 <134>1 2017-06-02T16:24:58+00:00 app
postgres.129728 - - [TEST] [7-3] sql_error_code = 00000 CONTEXT: while 
locking tuple (75,2) in relation "delayed_jobs"

LOG: process 129429 acquired ExclusiveLock on tuple (878044,83) of relation
16953 of database 16385 after 3220.356 ms

02 Jun 2017 20:24:58.338591 <134>1 2017-06-02T16:24:58+00:00 app 
postgres.129728 - - [TEST] [7-4] sql_error_code = 00000 STATEMENT: UPDATE 
"delayed_jobs" SET locked_at = '2017-06-02 16:24:57.033870', locked_by = 
'host:a96aff72dae123123e pid:4' WHERE id IN (SELECT id FROM 
"delayed_jobs" WHERE ((run_at <= '2017-06-02 16:24:57.032776' AND (locked_at 
IS NULL OR locked_at < '2017-06-02 12:24:57.032817') OR locked_by = 
'host:a96aff72dae123123e pid:4') AND failed_at IS NULL) 
ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING *

 sql_error_code = 00000 DETAIL: Process holding the lock: 129495. Wait queue: 
 3276.

 02 Jun 2017 20:25:09.279197 <134>1 2017-06-02T16:25:08+00:00 app  
 postgres.3276     
 - - [TEST] [7-3] sql_error_code = 00000 CONTEXT: while updating tuple 
 (878034,120) in relation "messages"


 02 Jun 2017 20:25:09.279248 <134>1 2017-06-02T16:25:08+00:00 app 
 postgres.3276
 - - [TEST] [7-4] sql_error_code = 00000 
 STATEMENT: UPDATE "messages" SET 
 "item_no" = COALESCE("item_no", 0) + 1 WHERE "messages"."id" = 
 48290879

<我想这不是一个普通的锁,有没有办法修复这些锁?

< P>我不知道你认为什么样的锁是正常的。当多个事务同时尝试更新或选择更新同一元组时,这是一种常见的锁定


但是,为什么使用这些锁的事务至少会占用它们一秒钟呢?交易本身是缓慢的,还是分散了注意力?

谢谢@jjanes,这种递增计数器方法会有任何问题吗?因为在一个地方我可以看到更新花费了很多时间,因为在我的应用程序中,这个增量发生了很多次对不起,我不知道增量计数器方法是什么。您的描述和日志文件的片段并没有真正解释您要做什么。increment_counter函数将自动递增1Hi@jjanes,您知道如何解决当多个事务试图同时更新同一元组时遇到的这种普通锁吗?在我的例子中,我们在表1中运行触发器来用元组更新报告表2,因此,如果我们为表2中的同一元组更新表1中的多个记录,我们会得到锁错误。非常感谢您的关注和参与。@lecompeters锁只在交易期间有效。尽可能快地执行从锁定开始到事务提交为止的每一步,或者对缓慢的步骤重新排序,以便在可能的情况下执行锁定之前执行这些步骤。如果不知道这些步骤是什么,就很难提出具体的建议。或者重新考虑报表系统的设计。它将内在地限制并发性。