PG Visibilidad de vacío

Dos de los casos, las transacciones no confirmadas uno xMin, xmin es una transacción ha sido enviado.
Para transacciones no confirmadas Xmin que sólo tiene que insertar la tupla actual no ha sido sometido a:
1) la tupla no es legítimo, es decir, mala tupla devuelta HEAPTUPLE_DEAD
2) La tupla es generado por la transacción actual: En este punto la transacción no está registrada en este o simplemente eliminar bloqueado o eliminar abortar un eliminarlo, y luego volver HAPTUPLE_INSERT_IN_PROGRESS; si se ha eliminado el registro, a continuación, vuelve HEAPTUPLE_DELETE_IN_PROGRESS
3) la tupla es generado por otras transacciones, marca cabecera tupla no comprometida: HEAP_INSERT_IN_POGRESS
4) la tupla se genera otras transacciones, estorbo xmin pantalla presentada: tupla está marcada como jefe HEAP_XMIN_COMMITTED.
5) En otros casos, esta transacción xmin no presentara, aborto o dañado: HEAPTUPLE_DEAD de retorno
para el xmin transacción se ha presentado, que el inserto tupla actual ha sido sometida a:
1) Xmax no presentó declaraciones de HEAPTUPLE_LIVE
2) tupla sólo se puede bloquear con: xmax comprometido: HEAPTUPLE_LIVE retorno
3) tupla de eliminación es: regreso HEAPTUPLE_DELETE_IN_PROGRESS
4) Zueco encontrado en xmax presentado: la cabeza marca de tupla HEAP_XMAX_COMMITTED
5) otras circunstancias de borrado no está presente: HEAPTUPLE_LIVE
6) el resto de la caja, tuple.t_xmax> = OldestXmin expresaron Asuntos ver también el valor de inserción: HEAPTUPLE_RECENTLY_DEAD
7) otros casos se han presentado XMAX: Volver HEAPTUPLE_DEAD
PG Visibilidad de vacío

HeapTupleSatisfiesVacuum
{
    HeapTupleHeader tuple = htup->t_data;

    if (!HeapTupleHeaderXminCommitted(tuple))//未提交
    {
        if (HeapTupleHeaderXminInvalid(tuple))//元组不合法,坏的元组
            return HEAPTUPLE_DEAD;
        else if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmin(tuple)))
        {//当前事务产生的元组
            if (tuple->t_infomask & HEAP_XMAX_INVALID)//未被删除,当前事务正在insert
                return HEAPTUPLE_INSERT_IN_PROGRESS;
            //元组被锁住,未被删除 或者 
            if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask) || HeapTupleHeaderIsOnlyLocked(tuple))
                return HEAPTUPLE_INSERT_IN_PROGRESS;
            //insert后当前事务又删除
            if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetUpdateXid(tuple)))
                return HEAPTUPLE_DELETE_IN_PROGRESS;
            //delete的子事务被abort,即insert正在进行
            return HEAPTUPLE_INSERT_IN_PROGRESS;
        }
        else if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmin(tuple)))
        {//其他事务正在insert
            return HEAPTUPLE_INSERT_IN_PROGRESS;
        }//从clog中读取tuple的事务状态,为提交则标记提交
        else if (TransactionIdDidCommit(HeapTupleHeaderGetRawXmin(tuple)))
            SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED,HeapTupleHeaderGetRawXmin(tuple));
        else
        {
            //真的tuple未提交、abort或者损坏
            SetHintBits(tuple, buffer, HEAP_XMIN_INVALID,InvalidTransactionId);
            return HEAPTUPLE_DEAD;
        }
        //此时,xmin已提交了。
    }

    /*
     * Okay, the inserter committed, so it was good at some point.  Now what
     * about the deleting transaction?
     */
    if (tuple->t_infomask & HEAP_XMAX_INVALID)
        return HEAPTUPLE_LIVE;//未被删除则该记录是活的

    if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask))
    {//只是锁住,未进行delete
        if (!(tuple->t_infomask & HEAP_XMAX_COMMITTED))
        {//delete事务未提交
            if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmax(tuple)))
                return HEAPTUPLE_LIVE;
            SetHintBits(tuple, buffer, HEAP_XMAX_INVALID,InvalidTransactionId);

        }
        return HEAPTUPLE_LIVE;
    }
    //delete未提交
    if (!(tuple->t_infomask & HEAP_XMAX_COMMITTED))
    {
        if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmax(tuple)))
            return HEAPTUPLE_DELETE_IN_PROGRESS;//delete正在进行
        else if (TransactionIdDidCommit(HeapTupleHeaderGetRawXmax(tuple)))//从clog中检查delete提交了
            SetHintBits(tuple, buffer, HEAP_XMAX_COMMITTED,HeapTupleHeaderGetRawXmax(tuple));
        else
        {
            //真的未提交、abort或者损坏
            SetHintBits(tuple, buffer, HEAP_XMAX_INVALID,InvalidTransactionId);
            return HEAPTUPLE_LIVE;
        }
        //此时delete已提交
    }
    //有事务还可能看到他
    //tuple->t_choice.t_heap.t_xmax >= OldestXmin
    if (!TransactionIdPrecedes(HeapTupleHeaderGetRawXmax(tuple), OldestXmin))
        return HEAPTUPLE_RECENTLY_DEAD;
    /* Otherwise, it's dead and removable */
    return HEAPTUPLE_DEAD;
}

Supongo que te gusta

Origin blog.51cto.com/yanzongshuai/2482580
Recomendado
Clasificación