diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index dc3d8d9..c17770d 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -919,6 +919,7 @@ LockAcquireExtended(const LOCKTAG *locktag,
 		else
 			return LOCKACQUIRE_NOT_AVAIL;
 	}
+
 	locallock->proclock = proclock;
 	lock = proclock->tag.myLock;
 	locallock->lock = lock;
@@ -949,7 +950,7 @@ LockAcquireExtended(const LOCKTAG *locktag,
 		 * blocking, remove useless table entries and return NOT_AVAIL without
 		 * waiting.
 		 */
-		if (dontWait)
+		if (dontWait || (locktag->locktag_type == LOCKTAG_TRANSACTION && lock->waitProcs.size > 0 && lockmode == ShareLock))
 		{
 			AbortStrongLockAcquire();
 			if (proclock->holdMask == 0)
@@ -973,12 +974,27 @@ LockAcquireExtended(const LOCKTAG *locktag,
 			LOCK_PRINT("LockAcquire: conditional lock failed", lock, lockmode);
 			Assert((lock->nRequested > 0) && (lock->requested[lockmode] >= 0));
 			Assert(lock->nGranted <= lock->nRequested);
+			if (!dontWait)
+			{
+				PROC_QUEUE *waitQueue = &(lock->waitProcs);
+				PGPROC	   *proc = (PGPROC*) waitQueue->links.prev;
+				PGXACT	   *pgxact = &ProcGlobal->allPgXact[proc->pgprocno];
+				TransactionId xid = pgxact->xid;
+				Assert(proc != MyProc && TransactionIdIsValid(xid));
+				SET_LOCKTAG_TRANSACTION(*(LOCKTAG *)locktag, xid);
+				LWLockRelease(partitionLock);
+				if (locallock->nLocks == 0)
+					RemoveLocalLock(locallock);
+				return LockAcquire(locktag,
+								   lockmode,
+								   sessionLock,
+								   dontWait);
+			}
 			LWLockRelease(partitionLock);
 			if (locallock->nLocks == 0)
 				RemoveLocalLock(locallock);
 			return LOCKACQUIRE_NOT_AVAIL;
 		}
-
 		/*
 		 * Set bitmask of locks this process already holds on this object.
 		 */
