mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
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
This commit is contained in:
@ -391,6 +391,14 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for a conflict-in as we would if we were going to
|
||||
* write to this page. We aren't actually going to write,
|
||||
* but we want a chance to report SSI conflicts that would
|
||||
* otherwise be masked by this unique constraint violation.
|
||||
*/
|
||||
CheckForSerializableConflictIn(rel, NULL, buf);
|
||||
|
||||
/*
|
||||
* This is a definite conflict. Break the tuple down into
|
||||
* datums and report the error. But first, make sure we
|
||||
|
Reference in New Issue
Block a user