生产环境两个应用在同时执行一个批量更新的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 的数据进行更新操作,为什么还会出现死锁?