Commit ee3838b1 authored by Heikki Linnakangas's avatar Heikki Linnakangas

You must hold a lock on the heap page when you call

CheckForSerializableConflictOut(), because it can set hint bits.

YAMAMOTO Takashi
parent 12bf602f
...@@ -1472,10 +1472,10 @@ heap_fetch(Relation relation, ...@@ -1472,10 +1472,10 @@ heap_fetch(Relation relation,
if (valid) if (valid)
PredicateLockTuple(relation, tuple); PredicateLockTuple(relation, tuple);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
CheckForSerializableConflictOut(valid, relation, tuple, buffer); CheckForSerializableConflictOut(valid, relation, tuple, buffer);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
if (valid) if (valid)
{ {
/* /*
......
...@@ -3366,9 +3366,10 @@ XidIsConcurrent(TransactionId xid) ...@@ -3366,9 +3366,10 @@ XidIsConcurrent(TransactionId xid)
* If the transactions overlap (i.e., they cannot see each other's writes), * If the transactions overlap (i.e., they cannot see each other's writes),
* then we have a conflict out. * then we have a conflict out.
* *
* This function should be called just about anywhere in heapam.c that a * This function should be called just about anywhere in heapam.c where a
* tuple has been read. There is currently no known reason to call this * tuple has been read. The caller must hold at least a shared lock on the
* function from an index AM. * buffer, because this function might set hint bits on the tuple. There is
* currently no known reason to call this function from an index AM.
*/ */
void void
CheckForSerializableConflictOut(const bool visible, const Relation relation, CheckForSerializableConflictOut(const bool visible, const Relation relation,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment