修复事务并发bug

This commit is contained in:
q00421813
2024-07-28 11:27:29 +08:00
parent 6cd2c376bf
commit 4ad7ea0cc3
3 changed files with 5 additions and 7 deletions

View File

@ -427,11 +427,6 @@ static bool UBTreeVisibilityCheckWrap(IndexScanDesc scan, Page page, OffsetNumbe
*/ */
TransactionIdStatus UBTreeCheckXid(TransactionId xid) TransactionIdStatus UBTreeCheckXid(TransactionId xid)
{ {
if (xid == FrozenTransactionId || (TransactionIdIsNormal(xid) &&
TransactionIdPrecedes(xid, pg_atomic_read_u64(&g_instance.undo_cxt.globalRecycleXid)) &&
!RecoveryInProgress())) {
return XID_COMMITTED;
}
TransactionIdStatus ts = TransactionIdGetStatus(xid); TransactionIdStatus ts = TransactionIdGetStatus(xid);
/* Please refer to HeapTupleSatisfiesVaccum */ /* Please refer to HeapTupleSatisfiesVaccum */
if (ts == XID_INPROGRESS) { if (ts == XID_INPROGRESS) {

View File

@ -531,6 +531,7 @@ void UHeapPagePruneFSM(Relation relation, Buffer buffer, TransactionId fxid, Pag
static ShortTransactionId UHeapTupleSetModifiedXid(Relation relation, static ShortTransactionId UHeapTupleSetModifiedXid(Relation relation,
Buffer buffer, UHeapTuple utuple, TransactionId xid) Buffer buffer, UHeapTuple utuple, TransactionId xid)
{ {
Assert(!UHEAP_XID_IS_LOCK(utuple->disk_tuple->flag));
TransactionId xidbase = InvalidTransactionId; TransactionId xidbase = InvalidTransactionId;
ShortTransactionId tupleXid = 0; ShortTransactionId tupleXid = 0;
UHeapTupleCopyBaseFromPage(utuple, BufferGetPage(buffer)); UHeapTupleCopyBaseFromPage(utuple, BufferGetPage(buffer));
@ -3106,10 +3107,8 @@ check_tup_satisfies_update:
/* oldtup should be pointing to right place in page */ /* oldtup should be pointing to right place in page */
Assert(oldtup.disk_tuple == (UHeapDiskTuple)UPageGetRowData(page, lp)); Assert(oldtup.disk_tuple == (UHeapDiskTuple)UPageGetRowData(page, lp));
int16 tmpLockInfo = oldtup.disk_tuple->flag & SINGLE_LOCKER_INFOMASK;
UHeapTupleHeaderSetTDSlot(oldtup.disk_tuple, oldtupNewTransSlot); UHeapTupleHeaderSetTDSlot(oldtup.disk_tuple, oldtupNewTransSlot);
oldtup.disk_tuple->flag &= ~UHEAP_VIS_STATUS_MASK; oldtup.disk_tuple->flag &= ~UHEAP_VIS_STATUS_MASK;
oldtup.disk_tuple->flag |= tmpLockInfo;
oldtup.disk_tuple->flag |= infomaskOldTuple; oldtup.disk_tuple->flag |= infomaskOldTuple;
tupleXid = UHeapTupleSetModifiedXid(relation, buffer, &oldtup, fxid); tupleXid = UHeapTupleSetModifiedXid(relation, buffer, &oldtup, fxid);
@ -3119,6 +3118,7 @@ check_tup_satisfies_update:
uheaptup->disk_tuple->flag |= infomaskNewTuple; uheaptup->disk_tuple->flag |= infomaskNewTuple;
uheaptup->xc_node_id = u_sess->pgxc_cxt.PGXCNodeIdentifier; uheaptup->xc_node_id = u_sess->pgxc_cxt.PGXCNodeIdentifier;
if (buffer == newbuf) { if (buffer == newbuf) {
Assert(!UHEAP_XID_IS_LOCK(uheaptup->disk_tuple->flag));
uheaptup->disk_tuple->flag |= SINGLE_LOCKER_XID_IS_TRANS; uheaptup->disk_tuple->flag |= SINGLE_LOCKER_XID_IS_TRANS;
UHeapTupleSetRawXid(uheaptup, tupleXid); UHeapTupleSetRawXid(uheaptup, tupleXid);
} else { } else {

View File

@ -73,6 +73,7 @@ static UHeapTupleStatus UHeapTupleGetStatus(const UHeapTuple utup)
return UHEAPTUPLESTATUS_MULTI_LOCKED; return UHEAPTUPLESTATUS_MULTI_LOCKED;
} else if ((SINGLE_LOCKER_XID_IS_EXCL_LOCKED(infomask) || SINGLE_LOCKER_XID_IS_SHR_LOCKED(infomask)) && } else if ((SINGLE_LOCKER_XID_IS_EXCL_LOCKED(infomask) || SINGLE_LOCKER_XID_IS_SHR_LOCKED(infomask)) &&
TransactionIdIsNormal(locker) && !TransactionIdOlderThanFrozenXid(locker)) { TransactionIdIsNormal(locker) && !TransactionIdOlderThanFrozenXid(locker)) {
Assert(!UHEAP_XID_IS_TRANS(utuple->flag));
return UHEAPTUPLESTATUS_LOCKED; // locked by select-for-update or select-for-share return UHEAPTUPLESTATUS_LOCKED; // locked by select-for-update or select-for-share
} else if (infomask & UHEAP_INPLACE_UPDATED) { } else if (infomask & UHEAP_INPLACE_UPDATED) {
return UHEAPTUPLESTATUS_INPLACE_UPDATED; // modified or locked by lock-for-update return UHEAPTUPLESTATUS_INPLACE_UPDATED; // modified or locked by lock-for-update
@ -243,6 +244,7 @@ bool UHeapTupleSatisfiesVisibility(UHeapTuple uhtup, Snapshot snapshot, Buffer b
if (utuple != NULL && TransactionIdIsNormal(fxid) && IsMVCCSnapshot(snapshot) && if (utuple != NULL && TransactionIdIsNormal(fxid) && IsMVCCSnapshot(snapshot) &&
SINGLE_LOCKER_XID_IS_EXCL_LOCKED(utuple->disk_tuple->flag)) { SINGLE_LOCKER_XID_IS_EXCL_LOCKED(utuple->disk_tuple->flag)) {
Assert(UHEAP_XID_IS_EXCL_LOCKED(utuple->disk_tuple->flag)); Assert(UHEAP_XID_IS_EXCL_LOCKED(utuple->disk_tuple->flag));
Assert(!UHEAP_XID_IS_TRANS(utuple->disk_tuple->flag));
lockerXid = UHeapTupleGetRawXid(utuple); lockerXid = UHeapTupleGetRawXid(utuple);
tupleIsExclusivelyLocked = true; tupleIsExclusivelyLocked = true;
} }
@ -1261,6 +1263,7 @@ TM_Result UHeapTupleSatisfiesUpdate(Relation rel, Snapshot snapshot, ItemPointer
UHeapTupleStatus tupleStatus = UHeapTupleGetStatus(utuple); UHeapTupleStatus tupleStatus = UHeapTupleGetStatus(utuple);
/* tuple is no longer locked by a single locker */ /* tuple is no longer locked by a single locker */
if (tupleStatus != UHEAPTUPLESTATUS_LOCKED && SINGLE_LOCKER_XID_IS_EXCL_LOCKED(tupleData->flag)) { if (tupleStatus != UHEAPTUPLESTATUS_LOCKED && SINGLE_LOCKER_XID_IS_EXCL_LOCKED(tupleData->flag)) {
Assert(!UHEAP_XID_IS_TRANS(utuple->disk_tuple->flag));
UHeapTupleHeaderClearSingleLocker(tupleData); UHeapTupleHeaderClearSingleLocker(tupleData);
} }