Re: MERGE behavior with REPEATABLE READ isolation level
Tender Wang <tndrwang@gmail.com>
From: Tender Wang <tndrwang@gmail.com>
To: Alexander Korotkov <aekorotkov@gmail.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2026-02-24T03:12:20Z
Lists: pgsql-hackers
Attachments
- 0001-Fix-MERGE-match-do-update-in-RR-isolation-level.patch (text/plain) patch 0001
Hi Alexander, Alexander Korotkov <aekorotkov@gmail.com> 于2026年2月15日周日 09:23写道: > Oh, sorry I missed the begin statement for s1. The complete case should look like this. > > s1# create table test (id int primary key, val int); > s1# insert into test values (1,0); > > s2# begin; > s2# update test set val = val + 100; > > s1# begin isolation level repeatable read; > s1# MERGE INTO test t USING (VALUES (1, 100)) AS s (id, inc) > ON t.id = s.id > WHEN MATCHED THEN > UPDATE SET val = t.val + s.inc > WHEN NOT MATCHED THEN > INSERT (id, val) VALUES (s.id, s.inc); > (waiting ...) > > s2# commit; > > s1# MERGE 1 > s1# select * from test; > id | val > ----+----- > 1 | 200 > (1 row) > I tried "update test set val = val + 100;" but the SQL reported a "could not serialize access due to concurrent update" error. It seems that the MERGE command should behave identically to UPDATE when performing a match action. I wrote a fix patch and attached it, and added your test case, too. -- Thanks, Tender Wang
Commits
-
Fix handling of updated tuples in the MERGE statement
- f6e63d4b8b2e 16.14 landed
- 8bfaae6fb20c 15.18 landed
- 2dcac93c0065 17.10 landed
- 13fab378e630 18.4 landed
- 177037341a44 19 (unreleased) landed