Maison base de données tutoriel mysql BDB事务共享区域

BDB事务共享区域

Jun 07, 2016 pm 04:26 PM
事务 共享 district 区域 nous enfin

最后我们来看一下事务共享区域。 首先仍然是每个进程都有的一个数据结构__db_txnmgr{}: /** The transaction manager encapsulates the transaction system. It contains* references to the log and lock managers as well as the state that keeps* track

最后我们来看一下事务共享区域。

首先仍然是每个进程都有的一个数据结构__db_txnmgr{}:

<code>/*
* The transaction manager encapsulates the transaction system.  It contains
* references to the log and lock managers as well as the state that keeps
* track of the shared memory region.
*/
struct __db_txnmgr {
/* These fields need to be protected for multi-threaded support. */
    db_mutex_t    *mutexp;    /* Synchronization. */
                    /* list of active transactions */
    TAILQ_HEAD(_chain, __db_txn)    txn_chain;
/* These fields are not protected. */
    REGINFO        reginfo;    /* Region information. */
    DB_ENV        *dbenv;        /* Environment. */
    int (*recover)            /* Recovery dispatch routine */
        __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
    u_int32_t     flags;        /* DB_TXN_NOSYNC, DB_THREAD */
    DB_TXNREGION    *region;    /* address of shared memory region */
    void        *mem;        /* address of the shalloc space */
};
</code>
Copier après la connexion

同样拥有一个指向描述共享区域的reginfo字段和指向共享区域的指针mem。

<code>/*
* Layout of the shared memory region.
* The region consists of a DB_TXNREGION structure followed by a large
* pool of shalloc'd memory which is used to hold TXN_DETAIL structures
* and thread mutexes (which are dynamically allocated).
*/
struct __db_txnregion {
    RLAYOUT        hdr;        /* Shared memory region header. */
    u_int32_t    magic;        /* transaction magic number */
    u_int32_t    version;    /* version number */
    u_int32_t    maxtxns;    /* maximum number of active txns */
    u_int32_t    last_txnid;    /* last transaction id given out */
    DB_LSN        pending_ckp;    /* last checkpoint did not finish */
    DB_LSN        last_ckp;    /* lsn of the last checkpoint */
    time_t        time_ckp;    /* time of last checkpoint */
    u_int32_t    logtype;    /* type of logging */
    u_int32_t    locktype;    /* lock type */
    u_int32_t    naborts;    /* number of aborted transactions */
    u_int32_t    ncommits;    /* number of committed transactions */
    u_int32_t    nbegins;    /* number of begun transactions */
    SH_TAILQ_HEAD(_active) active_txn;    /* active transaction list */
};
</code>
Copier après la connexion

共享区域除了有个公用的头部hdr字段以外,最重要的是有一个所有活动事务的列表active_txn字段。

现在让我们看一下这些数据结构和共享区域的创建或打开以及初始化操作。

在db_appinit()函数中调用txn_open()函数打开或连接一个事务共享区域:

<code>if (LF_ISSET(DB_INIT_TXN) && (ret = txn_open(NULL,
    LF_ISSET(DB_CREATE | DB_THREAD | DB_TXN_NOSYNC),
    mode, dbenv, &dbenv->tx_info)) != 0)
    goto err;
</code>
Copier après la connexion

其中txn_open定义如下:

<code>int
txn_open(path, flags, mode, dbenv, mgrpp)
    const char *path;
    u_int32_t flags;
    int mode;
    DB_ENV *dbenv;
    DB_TXNMGR **mgrpp;
{
    DB_TXNMGR *tmgrp;
    u_int32_t maxtxns;
    int ret;
    /* Validate arguments. */
    首先仍然是验证参数
    然后用malloc创建每个进程都有的事务管理器结构
    /* Now, create the transaction manager structure and set its fields. */
    if ((ret = __os_calloc(1, sizeof(DB_TXNMGR), &tmgrp)) != 0)
        return (ret);
    并初始化事务管理器结构
    /* Initialize the transaction manager structure. */
    tmgrp->mutexp = NULL;
    tmgrp->dbenv = dbenv;
    tmgrp->recover =
        dbenv->tx_recover == NULL ? __db_dispatch : dbenv->tx_recover;
    tmgrp->flags = LF_ISSET(DB_TXN_NOSYNC | DB_THREAD);
    TAILQ_INIT(&tmgrp->txn_chain);
    现在开始创建或连接到一个事务共享区域
    /* Join/create the txn region. */
    首先还是一样,填充区域描述信息REGINFO{},然后调用__db_rattach()函数创建或打开一个共享区域
    tmgrp->reginfo.dbenv = dbenv;
    tmgrp->reginfo.appname = DB_APP_NONE;
    if (path == NULL)
        tmgrp->reginfo.path = NULL;
    else
        if ((ret = __os_strdup(path, &tmgrp->reginfo.path)) != 0)
            goto err;
    tmgrp->reginfo.file = DEFAULT_TXN_FILE;
    tmgrp->reginfo.mode = mode;
    tmgrp->reginfo.size = TXN_REGION_SIZE(maxtxns);
    tmgrp->reginfo.dbflags = flags;
    tmgrp->reginfo.addr = NULL;
    tmgrp->reginfo.fd = -1;
    tmgrp->reginfo.flags = dbenv->tx_max == 0 ? REGION_SIZEDEF : 0;
    if ((ret = __db_rattach(&tmgrp->reginfo)) != 0)
        goto err;
    /* Fill in region-related fields. */
    tmgrp->region = tmgrp->reginfo.addr;
    tmgrp->mem = &tmgrp->region[1];
    if (F_ISSET(&tmgrp->reginfo, REGION_CREATED)) {
        tmgrp->region->maxtxns = maxtxns;
        if ((ret = __txn_init(tmgrp->region)) != 0)
            goto err;
    } else if (tmgrp->region->magic != DB_TXNMAGIC) {
        /* Check if valid region. */
        __db_err(dbenv, "txn_open: Bad magic number");
        ret = EINVAL;
        goto err;
    }
    // 如果这是一个新的事务共享区域,初始化之。这里又和MPOOL一样,
    // 使用__shmalloc函数管理共享区域内存
    if (LF_ISSET(DB_THREAD)) {
        if ((ret = __db_shalloc(tmgrp->mem, sizeof(db_mutex_t),
            MUTEX_ALIGNMENT, &tmgrp->mutexp)) == 0)
            /*
            * Since we only get here if threading is turned on, we
            * know that we have spinlocks, so the offset is going
            * to be ignored.  We put 0 here as a valid placeholder.
            */
            __db_mutex_init(tmgrp->mutexp, 0);
        if (ret != 0)
            goto err;
    }
    UNLOCK_TXNREGION(tmgrp);
    *mgrpp = tmgrp;
    return (0);
err:    if (tmgrp->reginfo.addr != NULL) {
        if (tmgrp->mutexp != NULL)
            __db_shalloc_free(tmgrp->mem, tmgrp->mutexp);
        UNLOCK_TXNREGION(tmgrp);
        (void)__db_rdetach(&tmgrp->reginfo);
        if (F_ISSET(&tmgrp->reginfo, REGION_CREATED))
            (void)txn_unlink(path, 1, dbenv);
    }
    if (tmgrp->reginfo.path != NULL)
        __os_freestr(tmgrp->reginfo.path);
    __os_free(tmgrp, sizeof(*tmgrp));
    return (ret);
}
</code>
Copier après la connexion

这个函数就是txn_open()调用来初始化事务共享区域的函数:

<code>/*
* This file contains the top level routines of the transaction library.
* It assumes that a lock manager and log manager that conform to the db_log(3)
* and db_lock(3) interfaces exist.
*
* Initialize a transaction region in shared memory.
* Return 0 on success, errno on failure.
*/
static int
__txn_init(txn_region)
    DB_TXNREGION *txn_region;
{
    time_t now;
    (void)time(&now);
    /* maxtxns is already initialized. */
    txn_region->magic = DB_TXNMAGIC;
    txn_region->version = DB_TXNVERSION;
    txn_region->last_txnid = TXN_MINIMUM;
    /*
    * XXX
    * If we ever do more types of locking and logging, this changes.
    */
    txn_region->logtype = 0;
    txn_region->locktype = 0;
    txn_region->time_ckp = now;
    ZERO_LSN(txn_region->last_ckp);
    ZERO_LSN(txn_region->pending_ckp);
    SH_TAILQ_INIT(&txn_region->active_txn);
    __db_shalloc_init((void *)&txn_region[1],
        TXN_REGION_SIZE(txn_region->maxtxns) - sizeof(DB_TXNREGION));
    return (0);
}
</code>
Copier après la connexion

其中DB_TXN{}是每个事务的描述符(定义在db_int.h文件中):

<code>/* The structure allocated for every transaction. */
struct __db_txn {
    DB_TXNMGR    *mgrp;        /* Pointer to transaction manager. */
    DB_TXN        *parent;    /* Pointer to transaction's parent. */
    DB_LSN        last_lsn;    /* Lsn of last log write. */
    u_int32_t    txnid;        /* Unique transaction id. */
    size_t        off;        /* Detail structure within region. */
    TAILQ_ENTRY(__db_txn) links;    /* Links transactions off manager. */
    TAILQ_HEAD(__kids, __db_txn) kids; /* Child transactions. */
    TAILQ_ENTRY(__db_txn) klinks;    /* Links child transactions. */
#define    TXN_MALLOC    0x01        /* Structure allocated by TXN system. */
    u_int32_t    flags;
};
typedef struct __txn_detail {
    u_int32_t txnid;        /* current transaction id
                    used to link free list also */
    DB_LSN    last_lsn;        /* last lsn written for this txn */
    DB_LSN    begin_lsn;        /* lsn of begin record */
    size_t    last_lock;        /* offset in lock region of last lock
                    for this transaction. */
    size_t    parent;            /* Offset of transaction's parent. */
#define    TXN_UNALLOC    0
#define    TXN_RUNNING    1
#define    TXN_ABORTED    2
#define    TXN_PREPARED    3
#define    TXN_COMMITTED    4
    u_int32_t status;        /* status of the transaction */
    SH_TAILQ_ENTRY    links;        /* free/active list */
#define    TXN_XA_ABORTED        1
#define    TXN_XA_DEADLOCKED    2
#define    TXN_XA_ENDED        3
#define    TXN_XA_PREPARED        4
#define    TXN_XA_STARTED        5
#define    TXN_XA_SUSPENDED    6
    u_int32_t xa_status;        /* XA status */
    /*
    * XID (xid_t) structure: because these fields are logged, the
    * sizes have to be explicit.
    */
    DB_XID xid;            /* XA global transaction id */
    u_int32_t bqual;        /* bqual_length from XID */
    u_int32_t gtrid;        /* gtrid_length from XID */
    int32_t format;            /* XA format */
} TXN_DETAIL;
</code>
Copier après la connexion
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment partager WallpaperEngine avec des amis Comment partager WallpaperEngine avec des amis Mar 18, 2024 pm 10:00 PM

Les utilisateurs peuvent partager les fonds d'écran qu'ils obtiennent avec des amis lorsqu'ils utilisent WallpaperEngine. De nombreux utilisateurs ne savent pas comment partager WallpaperEngine avec des amis. Ils peuvent enregistrer leurs fonds d'écran préférés localement, puis les partager avec des amis via un logiciel social. Comment partager WallpaperEngine avec des amis Réponse : Enregistrez-le localement et partagez-le avec vos amis. 1. Il est recommandé d'enregistrer vos fonds d'écran préférés localement, puis de les partager avec vos amis via un logiciel social. 2. Vous pouvez également le télécharger sur l'ordinateur via un dossier, puis cliquer sur Partager à l'aide de la fonction atelier créatif sur l'ordinateur. 3. Utilisez Wallpaperengine sur l'ordinateur, ouvrez la barre d'options de l'atelier créatif et recherchez

Comment partager l'écran sur WeChat Enterprise Comment partager l'écran sur WeChat Enterprise Feb 28, 2024 pm 12:43 PM

De plus en plus d'entreprises choisissent d'utiliser WeChat d'entreprise exclusif, ce qui non seulement facilite la communication entre les entreprises, les clients et les partenaires, mais améliore également considérablement l'efficacité du travail. Enterprise WeChat possède de riches fonctions, parmi lesquelles la fonction de partage d'écran est très populaire. Pendant la réunion, en partageant l'écran, les participants peuvent afficher le contenu de manière plus intuitive et collaborer plus efficacement. Alors, comment partager efficacement votre écran dans WeChat Enterprise ? Pour les utilisateurs qui ne le savent pas encore, ce guide didacticiel vous donnera une introduction détaillée. J'espère qu'il pourra vous aider ! Comment partager l'écran sur WeChat Enterprise ? 1. Dans la zone bleue sur le côté gauche de l'interface principale d'Enterprise WeChat, vous pouvez voir une liste de fonctions. Nous trouvons l'icône « Conférence ». Après avoir cliqué pour entrer, trois modes de conférence apparaîtront.

La fonctionnalité de partage rapide ne fonctionne pas sur les téléphones Samsung – Correctif La fonctionnalité de partage rapide ne fonctionne pas sur les téléphones Samsung – Correctif Sep 19, 2023 pm 04:25 PM

Quick Share peut faire gagner beaucoup de temps aux utilisateurs de Samsung lors du transfert de fichiers entre appareils. Mais les utilisateurs de Samsung Galaxy se sont plaints de problèmes avec la fonction Quick Share sur leurs téléphones. En règle générale, les problèmes de visibilité lors du partage rapide sont à l'origine de ce problème. C'est donc le seul guide dont vous avez besoin pour dépanner la fonction Quick Share sur votre appareil Galaxy. Correctif 1 – Modifier les paramètres de visibilité de partage rapide Basculez le paramètre de visibilité de partage rapide sur votre téléphone. Quick Share peut être défini sur des paramètres incorrects, provoquant ce problème. Étape 1 – Tout d’abord, faites glisser votre doigt vers le haut pour ouvrir le tiroir d’applications. Étape 2 – Une fois là-bas, ouvrez Paramètres. Étape 3 – Accédez à la page Paramètres et ouvrez l'onglet Appareils connectés. Étape 4 – Activez la fonction « Partage rapide ». Étape 5

Guide de partage de dossiers Windows 11 : partagez facilement vos fichiers et données Guide de partage de dossiers Windows 11 : partagez facilement vos fichiers et données Mar 13, 2024 am 11:49 AM

Dans la vie quotidienne et au travail, nous avons souvent besoin de partager des fichiers et des dossiers entre différents appareils. Le système Windows 11 offre des fonctions pratiques de partage de dossiers intégrées, nous permettant de partager facilement et en toute sécurité le contenu dont nous avons besoin avec d'autres au sein du même réseau tout en protégeant la confidentialité des fichiers personnels. Cette fonctionnalité rend le partage de fichiers simple et efficace sans se soucier de la fuite d'informations privées. Grâce à la fonction de partage de dossiers du système Windows 11, nous pouvons coopérer, communiquer et collaborer plus facilement, améliorant ainsi l'efficacité du travail et la commodité de la vie. Afin de réussir la configuration d'un dossier partagé, nous devons d'abord remplir les conditions suivantes : Tous les appareils (participant au partage) sont connectés au même réseau. Activez la découverte du réseau et configurez le partage. Connaître l'appareil cible

Comment utiliser NameDrop sur iPhone iOS 17 Comment utiliser NameDrop sur iPhone iOS 17 Sep 22, 2023 pm 11:41 PM

Avec le lancement de la nouvelle série de téléphones mobiles Apple iPhone15 et le lancement du dernier système d'exploitation mobile iOS17, une multitude de nouvelles fonctionnalités, ajustements et améliorations ont été apportées aux appareils Apple. Les utilisateurs se demandent peut-être comment utiliser la nouvelle fonctionnalité NameDrop sur iPhone et iOS17. Ce guide fournira un bref aperçu de la façon de partager vos informations de contact rapidement et efficacement à l'aide du nouveau système NameDrop disponible sur iOS17. NameDrop est une fonctionnalité qui permet aux utilisateurs d'iPhone de partager rapidement leurs informations de contact avec d'autres. C'est un outil pratique pour les événements sociaux, les réunions d'affaires ou les rassemblements sociaux où vous devez échanger des coordonnées avec de nouveaux amis. Cependant, il est important de noter que NameDrop ne fonctionne que pour envoyer de nouveaux contacts

L'imprimante partagée ne peut pas se connecter à l'imprimante L'imprimante partagée ne peut pas se connecter à l'imprimante Feb 22, 2024 pm 01:09 PM

Avec le développement de l’ère numérique, les imprimantes partagées sont devenues un élément indispensable de l’environnement de bureau moderne. Cependant, nous pouvons parfois rencontrer le problème que l'imprimante partagée ne peut pas être connectée à l'imprimante, ce qui affectera non seulement l'efficacité du travail, mais provoquera également une série de problèmes. Cet article vise à explorer les raisons et les solutions pour lesquelles une imprimante partagée ne peut pas se connecter à l'imprimante. Il existe de nombreuses raisons pour lesquelles une imprimante partagée ne peut pas se connecter à l'imprimante, la plus courante étant les problèmes de réseau. Si la connexion réseau entre l'imprimante partagée et l'imprimante est instable ou interrompue, le fonctionnement normal ne sera pas possible.

Comment protéger la confidentialité des photos et des affiches des contacts sur iPhone Comment protéger la confidentialité des photos et des affiches des contacts sur iPhone Sep 18, 2023 am 10:49 AM

Qui peut voir les photos et les affiches de vos contacts sur iPhone ? Apple propose des options pour personnaliser la façon dont vous apparaissez sur l'iPhone de quelqu'un lorsqu'il appelle ou envoie un message. Les options incluent Memoji, un texte simple ou une photo personnalisée avec des effets comme photo de contact et image d'affichage. Vous êtes libre de modifier ces sélections à tout moment et de basculer entre les profils sur la fiche de contact. De plus, Apple vous offre la possibilité de contrôler qui peut afficher et accéder aux photos ou afficher les images de votre choix sur iOS17. Vous pouvez décider de les partager avec des personnes enregistrées dans votre liste de contacts, ou vous pouvez configurer votre iPhone pour qu'il vous invite à chaque fois que vous interagissez avec un contact. Si vous le souhaitez, vous pouvez également désactiver le nom de manière permanente

Délai d'attente du verrouillage dépassé ; essayez de redémarrer la transaction - Comment résoudre l'erreur MySQL : délai d'attente de la transaction Délai d'attente du verrouillage dépassé ; essayez de redémarrer la transaction - Comment résoudre l'erreur MySQL : délai d'attente de la transaction Oct 05, 2023 am 08:46 AM

Lockwaittimeoutexceeded;tryrestartingtransaction - Comment résoudre l'erreur MySQL : délai d'attente de transaction Lorsque vous utilisez la base de données MySQL, vous pouvez parfois rencontrer une erreur courante : Lockwaittimeoutexceeded;tryrestartingtransaction. Cette erreur indique que le délai d'attente de transaction a expiré. Cette erreur se produit généralement lorsque

See all articles