Heim Datenbank MySQL-Tutorial BDB事务共享区域

BDB事务共享区域

Jun 07, 2016 pm 04:26 PM
事务 共享 Bezirk 区域 uns 最后

最后我们来看一下事务共享区域。 首先仍然是每个进程都有的一个数据结构__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>
Nach dem Login kopieren

同样拥有一个指向描述共享区域的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>
Nach dem Login kopieren

共享区域除了有个公用的头部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>
Nach dem Login kopieren

其中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>
Nach dem Login kopieren

这个函数就是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>
Nach dem Login kopieren

其中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>
Nach dem Login kopieren
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So teilen Sie WallpaperEngine mit Freunden So teilen Sie WallpaperEngine mit Freunden Mar 18, 2024 pm 10:00 PM

Benutzer können die Hintergrundbilder, die sie erhalten, mit Freunden teilen, wenn sie WallpaperEngine verwenden. Viele Benutzer wissen nicht, wie sie WallpaperEngine mit Freunden teilen können. Sie können ihre Lieblingshintergrundbilder lokal speichern und sie dann über soziale Software mit Freunden teilen. So teilen Sie WallpaperEngine mit Freunden Antwort: Speichern Sie es lokal und teilen Sie es mit Freunden. 1. Es wird empfohlen, dass Sie Ihre Lieblingshintergründe lokal speichern und sie dann über soziale Software mit Freunden teilen. 2. Sie können es auch über einen Ordner auf den Computer hochladen und dann über die Kreativ-Workshop-Funktion auf dem Computer auf „Teilen“ klicken. 3. Verwenden Sie Wallpaperengine auf dem Computer, öffnen Sie die Optionsleiste der Kreativwerkstatt und suchen Sie

So teilen Sie den Bildschirm auf WeChat Enterprise So teilen Sie den Bildschirm auf WeChat Enterprise Feb 28, 2024 pm 12:43 PM

Immer mehr Unternehmen entscheiden sich für den exklusiven Unternehmens-WeChat, der nicht nur die Kommunikation zwischen Unternehmen und Kunden und Partnern erleichtert, sondern auch die Arbeitseffizienz erheblich verbessert. Enterprise WeChat verfügt über umfangreiche Funktionen, unter denen die Bildschirmfreigabefunktion sehr beliebt ist. Während des Meetings können die Teilnehmer durch die gemeinsame Nutzung des Bildschirms Inhalte intuitiver darstellen und effizienter zusammenarbeiten. Wie können Sie Ihren Bildschirm in WeChat Enterprise effizient teilen? Für Benutzer, die es noch nicht wissen, wird Ihnen dieses Tutorial hoffentlich helfen! Wie teile ich den Bildschirm auf WeChat Enterprise? 1. Im blauen Bereich auf der linken Seite der Hauptoberfläche von Enterprise WeChat sehen Sie eine Liste der Funktionen. Nach dem Klicken zum Betreten werden drei Konferenzmodi angezeigt.

Quick Share-Funktion funktioniert auf Samsung-Telefonen nicht – Fix Quick Share-Funktion funktioniert auf Samsung-Telefonen nicht – Fix Sep 19, 2023 pm 04:25 PM

Quick Share kann Samsung-Benutzern viel Zeit beim Übertragen von Dateien zwischen Geräten sparen. Nutzer von Samsung Galaxy haben sich jedoch über Probleme mit der Quick Share-Funktion auf ihren Handys beschwert. Typischerweise sind Sichtbarkeitsprobleme bei der Schnellfreigabe die Ursache für dieses Problem. Dies ist also die einzige Anleitung, die Sie zur Fehlerbehebung bei der Quick Share-Funktion auf Ihrem Galaxy-Gerät benötigen. Fix 1 – Quick Share-Sichtbarkeitseinstellungen ändern Schalten Sie die Quick Share-Sichtbarkeitseinstellung auf Ihrem Telefon um. Möglicherweise sind für Quick Share die falschen Einstellungen festgelegt, was dieses Problem verursacht. Schritt 1 – Wischen Sie zunächst einmal nach oben, um die App-Schublade zu öffnen. Schritt 2 – Öffnen Sie dort die Einstellungen. Schritt 3 – Gehen Sie zur Seite „Einstellungen“ und öffnen Sie die Registerkarte „Verbundene Geräte“. Schritt 4 – Aktivieren Sie die Funktion „Quick Share“. Schritt 5

Anleitung zur Ordnerfreigabe für Windows 11: Teilen Sie Ihre Dateien und Daten ganz einfach Anleitung zur Ordnerfreigabe für Windows 11: Teilen Sie Ihre Dateien und Daten ganz einfach Mar 13, 2024 am 11:49 AM

Im täglichen Leben und bei der Arbeit müssen wir häufig Dateien und Ordner zwischen verschiedenen Geräten teilen. Das Windows 11-System bietet praktische integrierte Ordnerfreigabefunktionen, die es uns ermöglichen, die benötigten Inhalte einfach und sicher mit anderen im selben Netzwerk zu teilen und gleichzeitig die Privatsphäre persönlicher Dateien zu schützen. Diese Funktion macht die Dateifreigabe einfach und effizient, ohne dass Sie befürchten müssen, dass private Informationen verloren gehen. Durch die Ordnerfreigabefunktion des Windows 11-Systems können wir bequemer zusammenarbeiten, kommunizieren und zusammenarbeiten und so die Arbeitseffizienz und den Lebenskomfort verbessern. Um einen freigegebenen Ordner erfolgreich zu konfigurieren, müssen wir zunächst die folgenden Bedingungen erfüllen: Alle Geräte (die an der Freigabe teilnehmen) sind mit demselben Netzwerk verbunden. Aktivieren Sie die Netzwerkerkennung und konfigurieren Sie die Freigabe. Kennen Sie das Zielgerät

So verwenden Sie NameDrop auf dem iPhone iOS 17 So verwenden Sie NameDrop auf dem iPhone iOS 17 Sep 22, 2023 pm 11:41 PM

Mit der Einführung der neuen Mobiltelefone der Apple iPhone15-Serie und der Einführung des neuesten mobilen Betriebssystems iOS17 wurde eine Fülle neuer Funktionen, Anpassungen und Verbesserungen auf Apple-Geräte gebracht. Benutzer fragen sich möglicherweise, wie sie die neue NameDrop-Funktion auf iPhone und iOS17 verwenden können. Dieser Leitfaden bietet einen kurzen Überblick darüber, wie Sie Ihre Kontaktinformationen schnell und effizient mit dem neuen NameDrop-System teilen, das auf iOS17 verfügbar ist. NameDrop ist eine Funktion, die es iPhone-Benutzern ermöglicht, ihre Kontaktinformationen schnell mit anderen zu teilen. Es ist ein praktisches Tool für gesellschaftliche Veranstaltungen, Geschäftstreffen oder gesellschaftliche Zusammenkünfte, bei denen Sie Kontaktdaten mit neuen Freunden austauschen müssen. Es ist jedoch wichtig zu beachten, dass NameDrop nur zum Versenden neuer Kontakte funktioniert

Der freigegebene Drucker kann keine Verbindung zum Drucker herstellen Der freigegebene Drucker kann keine Verbindung zum Drucker herstellen Feb 22, 2024 pm 01:09 PM

Mit der Entwicklung des digitalen Zeitalters sind gemeinsam genutzte Drucker zu einem unverzichtbaren Bestandteil der modernen Büroumgebung geworden. Manchmal kann es jedoch vorkommen, dass der freigegebene Drucker nicht mit dem Drucker verbunden werden kann, was nicht nur die Arbeitseffizienz beeinträchtigt, sondern auch eine Reihe von Problemen verursacht. Ziel dieses Artikels ist es, die Gründe und Lösungen dafür zu untersuchen, warum ein freigegebener Drucker keine Verbindung zum Drucker herstellen kann. Es gibt viele Gründe, warum ein freigegebener Drucker keine Verbindung zum Drucker herstellen kann. Der häufigste Grund sind Netzwerkprobleme. Wenn die Netzwerkverbindung zwischen dem freigegebenen Drucker und dem Drucker instabil oder unterbrochen ist, ist ein normaler Betrieb nicht möglich.

So schützen Sie die Privatsphäre von Kontaktfotos und Postern auf dem iPhone So schützen Sie die Privatsphäre von Kontaktfotos und Postern auf dem iPhone Sep 18, 2023 am 10:49 AM

Wer kann Ihre Kontaktfotos und Poster auf dem iPhone ansehen? Apple bietet Optionen zum Personalisieren, wie Sie auf dem iPhone einer anderen Person angezeigt werden, wenn diese anruft oder eine Nachricht sendet. Zu den Optionen gehören Memoji, einfacher Text oder ein benutzerdefiniertes Foto mit Effekten als Kontaktfoto und Anzeigebild. Sie können diese Auswahl jederzeit ändern und zwischen den Profilen auf der Kontaktkarte wechseln. Darüber hinaus gibt Ihnen Apple die Möglichkeit zu steuern, wer auf iOS17 Fotos ansehen und darauf zugreifen oder Bilder Ihrer Wahl anzeigen kann. Sie können diese mit Personen teilen, die in Ihrer Kontaktliste gespeichert sind, oder Sie können Ihr iPhone so einstellen, dass es Sie jedes Mal benachrichtigt, wenn Sie mit einem Kontakt interagieren. Wenn Sie möchten, können Sie den Namen auch dauerhaft deaktivieren

Sperrwartezeitüberschreitung überschritten; versuchen Sie, die Transaktion neu zu starten – So beheben Sie den MySQL-Fehler: Transaktionswartezeitüberschreitung Sperrwartezeitüberschreitung überschritten; versuchen Sie, die Transaktion neu zu starten – So beheben Sie den MySQL-Fehler: Transaktionswartezeitüberschreitung Oct 05, 2023 am 08:46 AM

Lockwaittimeoutexceeded;tryrestartingtransaction – So beheben Sie den MySQL-Fehler: Transaktionswartezeitüberschreitung Bei Verwendung der MySQL-Datenbank kann es manchmal zu einem häufigen Fehler kommen: Lockwaittimeoutexceeded;tryrestartingtransaction. Dieser Fehler weist auf eine Transaktionswartezeitüberschreitung hin. Dieser Fehler tritt normalerweise auf, wenn

See all articles