mirror of
https://github.com/postgres/postgres.git
synced 2025-11-15 03:41:20 +03:00
Fix bug in PreCommit_CheckForSerializationFailure. A transaction that has
already been marked as PREPARED cannot be killed. Kill the current transaction instead. One of the prepared_xacts regression tests actually hits this bug. I removed the anomaly from the duplicate-gids test so that it fails in the intended way, and added a new test to check serialization failures with a prepared transaction. Dan Ports
This commit is contained in:
@@ -4542,6 +4542,21 @@ PreCommit_CheckForSerializationFailure(void)
|
||||
&& !SxactIsReadOnly(farConflict->sxactOut)
|
||||
&& !SxactIsDoomed(farConflict->sxactOut)))
|
||||
{
|
||||
/*
|
||||
* Normally, we kill the pivot transaction to make sure we
|
||||
* make progress if the failing transaction is retried.
|
||||
* However, we can't kill it if it's already prepared, so
|
||||
* in that case we commit suicide instead.
|
||||
*/
|
||||
if (SxactIsPrepared(nearConflict->sxactOut))
|
||||
{
|
||||
LWLockRelease(SerializableXactHashLock);
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
|
||||
errmsg("could not serialize access due to read/write dependencies among transactions"),
|
||||
errdetail("Cancelled on commit attempt with conflict in from prepared pivot."),
|
||||
errhint("The transaction might succeed if retried.")));
|
||||
}
|
||||
nearConflict->sxactOut->flags |= SXACT_FLAG_DOOMED;
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user