diff options
Diffstat (limited to 'src/backend/access/heap/heapam.c')
| -rw-r--r-- | src/backend/access/heap/heapam.c | 19 | 
1 files changed, 16 insertions, 3 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 64174b6ea25..1a0dd2139a5 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -4842,10 +4842,23 @@ test_lockmode_for_conflict(MultiXactStatus status, TransactionId xid,  	else if (TransactionIdDidCommit(xid))  	{  		/* -		 * If the updating transaction committed, what we do depends on whether -		 * the lock modes conflict: if they do, then we must report error to -		 * caller.  But if they don't, we can fall through to lock it. +		 * The other transaction committed.  If it was only a locker, then the +		 * lock is completely gone now and we can return success; but if it +		 * was an update, then what we do depends on whether the two lock +		 * modes conflict.	If they conflict, then we must report error to +		 * caller. But if they don't, we can fall through to allow the current +		 * transaction to lock the tuple. +		 * +		 * Note: the reason we worry about ISUPDATE here is because as soon as +		 * a transaction ends, all its locks are gone and meaningless, and +		 * thus we can ignore them; whereas its updates persist.  In the +		 * TransactionIdIsInProgress case, above, we don't need to check +		 * because we know the lock is still "alive" and thus a conflict needs +		 * always be checked.  		 */ +		if (!ISUPDATE_from_mxstatus(status)) +			return HeapTupleMayBeUpdated; +  		if (DoLockModesConflict(LOCKMODE_from_mxstatus(status),  								LOCKMODE_from_mxstatus(wantedstatus)))  			/* bummer */  | 
