postgresql并发更新的死锁

生产环境两个应用在同时执行一个批量更新的sql 语句时发生了死锁
数据库是 postgresql
涉及的表 t_order_status结构 :
CREATE TABLE "public"."t_order_status" (
"order_id" int8 NOT NULL,
"status" int2 NOT NULL DEFAULT 0,
"create_time" timestamp(6) NOT NULL
) 主键是order_id

并发操作的sql语句:

        UPDATE t_order_status SET status=1 WHERE order_id IN 
            (SELECT t_order_status.order_id
            FROM t_order_status 
            INNER JOIN t_order
                ON t_order_status.order_id = t_order.id
            WHERE 
                create_time < #{nowTimestamp}
                AND t_order_status.status=0 ORDER BY create_time ASC limit 100  FOR UPDATE)
                

错误信息如下:
Process 59262 waits for ShareLock on transaction 162600472; blocked by process 59206.n Hint: See server log for query details.n Where: while locking tuple (2350,57) in relation t_order_status

因为我已经在where 的子查询加上 select for update了,应该只有一个进程才有对满足条件的t_order_status 的数据进行更新操作,为什么还会出现死锁?

阅读 3.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进