pgsql: Detect SSI conflicts before reporting constraint violations

From: Kevin Grittner <kgrittn(at)postgresql(dot)org>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Detect SSI conflicts before reporting constraint violations
Date: 2016-04-07 16:14:02
Message-ID: E1aoCZG-0004rH-Uk@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Detect SSI conflicts before reporting constraint violations

While prior to this patch the user-visible effect on the database
of any set of successfully committed serializable transactions was
always consistent with some one-at-a-time order of execution of
those transactions, the presence of declarative constraints could
allow errors to occur which were not possible in any such ordering,
and developers had no good workarounds to prevent user-facing
errors where they were not necessary or desired. This patch adds
a check for serialization failure ahead of duplicate key checking
so that if a developer explicitly (redundantly) checks for the
pre-existing value they will get the desired serialization failure
where the problem is caused by a concurrent serializable
transaction; otherwise they will get a duplicate key error.

While it would be better if the reads performed by the constraints
could count as part of the work of the transaction for
serialization failure checking, and we will hopefully get there
some day, this patch allows a clean and reliable way for developers
to work around the issue. In many cases existing code will already
be doing the right thing for this to "just work".

Author: Thomas Munro, with minor editing of docs by me
Reviewed-by: Marko Tiikkaja, Kevin Grittner

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/fcff8a575198478023ada8a48e13b50f70054766

Modified Files
--------------
doc/src/sgml/mvcc.sgml | 35 ++++++++++++----
src/backend/access/nbtree/nbtinsert.c | 8 ++++
.../isolation/expected/read-write-unique-2.out | 29 +++++++++++++
.../isolation/expected/read-write-unique-3.out | 12 ++++++
.../isolation/expected/read-write-unique-4.out | 41 ++++++++++++++++++
src/test/isolation/expected/read-write-unique.out | 29 +++++++++++++
src/test/isolation/isolation_schedule | 4 ++
src/test/isolation/specs/read-write-unique-2.spec | 36 ++++++++++++++++
src/test/isolation/specs/read-write-unique-3.spec | 33 +++++++++++++++
src/test/isolation/specs/read-write-unique-4.spec | 48 ++++++++++++++++++++++
src/test/isolation/specs/read-write-unique.spec | 39 ++++++++++++++++++
11 files changed, 307 insertions(+), 7 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Teodor Sigaev 2016-04-07 16:33:29 pgsql: Make testing of phraseto_tsquery independ from value of
Previous Message Teodor Sigaev 2016-04-07 15:58:14 pgsql: Phrase full text search.