• T
    Allow snapshot references to still work during transaction abort. · 57eb0090
    Tom Lane 提交于
    In REPEATABLE READ (nee SERIALIZABLE) mode, an attempt to do
    GetTransactionSnapshot() between AbortTransaction and CleanupTransaction
    failed, because GetTransactionSnapshot would recompute the transaction
    snapshot (which is already wrong, given the isolation mode) and then
    re-register it in the TopTransactionResourceOwner, leading to an Assert
    because the TopTransactionResourceOwner should be empty of resources after
    AbortTransaction.  This is the root cause of bug #6218 from Yamamoto
    Takashi.  While changing plancache.c to avoid requesting a snapshot when
    handling a ROLLBACK masks the problem, I think this is really a snapmgr.c
    bug: it's lower-level than the resource manager mechanism and should not be
    shutting itself down before we unwind resource manager resources.  However,
    just postponing the release of the transaction snapshot until cleanup time
    didn't work because of the circular dependency with
    TopTransactionResourceOwner.  Fix by managing the internal reference to
    that snapshot manually instead of depending on TopTransactionResourceOwner.
    This saves a few cycles as well as making the module layering more
    straightforward.  predicate.c's dependencies on TopTransactionResourceOwner
    go away too.
    
    I think this is a longstanding bug, but there's no evidence that it's more
    than a latent bug, so it doesn't seem worth any risk of back-patching.
    57eb0090
xact.c 133.9 KB