Rumah pangkalan data tutorial mysql BDB事务共享区域

BDB事务共享区域

Jun 07, 2016 pm 04:26 PM
hal ehwal dikongsi daerah kawasan kami akhirnya

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

同样拥有一个指向描述共享区域的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>
Salin selepas log masuk

共享区域除了有个公用的头部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>
Salin selepas log masuk

其中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>
Salin selepas log masuk

这个函数就是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>
Salin selepas log masuk

其中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>
Salin selepas log masuk
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk berkongsi kertas dinding enjin dengan rakan-rakan Bagaimana untuk berkongsi kertas dinding enjin dengan rakan-rakan Mar 18, 2024 pm 10:00 PM

Pengguna boleh berkongsi kertas dinding yang mereka perolehi dengan rakan apabila menggunakan WallpaperEngine Ramai pengguna tidak tahu cara berkongsi WallpaperEngine dengan rakan Mereka boleh menyimpan kertas dinding kegemaran mereka secara tempatan dan kemudian berkongsinya dengan rakan melalui perisian sosial. Bagaimana untuk berkongsi enjin kertas dinding dengan rakan Jawapan: Simpan ia secara setempat dan kongsi dengan rakan. 1. Adalah disyorkan agar anda menyimpan kertas dinding kegemaran anda secara tempatan dan kemudian berkongsinya dengan rakan melalui perisian sosial. 2. Anda juga boleh memuat naiknya ke komputer melalui folder, dan kemudian klik Kongsi menggunakan fungsi bengkel kreatif pada komputer. 3. Gunakan Wallpaperengine pada komputer, buka bar pilihan bengkel kreatif dan cari

Cara berkongsi skrin pada WeChat Enterprise Cara berkongsi skrin pada WeChat Enterprise Feb 28, 2024 pm 12:43 PM

Semakin banyak perusahaan memilih untuk menggunakan WeChat perusahaan eksklusif, yang bukan sahaja memudahkan komunikasi antara perusahaan dengan pelanggan dan rakan kongsi, tetapi juga meningkatkan kecekapan kerja dengan sangat baik. Enterprise WeChat mempunyai fungsi yang kaya, antaranya fungsi perkongsian skrin sangat popular. Semasa mesyuarat, dengan berkongsi skrin, peserta boleh memaparkan kandungan dengan lebih intuitif dan bekerjasama dengan lebih cekap. Jadi bagaimana untuk berkongsi skrin anda dengan cekap dalam WeChat Enterprise Bagi pengguna yang belum tahu, panduan tutorial ini akan memberikan pengenalan terperinci kepada anda. Bagaimana untuk berkongsi skrin pada WeChat Enterprise? 1. Di kawasan biru di sebelah kiri antara muka utama Enterprise WeChat, anda boleh melihat senarai fungsi Kami mendapati ikon "Persidangan" Selepas mengklik untuk masuk, tiga mod persidangan akan muncul.

Ciri Kongsi Pantas tidak berfungsi pada telefon Samsung – Betulkan Ciri Kongsi Pantas tidak berfungsi pada telefon Samsung – Betulkan Sep 19, 2023 pm 04:25 PM

Kongsi Pantas boleh menjimatkan banyak masa pengguna Samsung memindahkan fail antara peranti. Tetapi pengguna Samsung Galaxy telah mengadu tentang menghadapi masalah dengan ciri perkongsian pantas pada telefon mereka. Biasanya, isu keterlihatan dalam perkongsian pantas menyebabkan isu ini. Jadi, ini adalah satu-satunya panduan yang anda perlukan untuk menyelesaikan masalah ciri Kongsi Pantas pada peranti Galaxy anda. Betulkan 1 – Tukar Tetapan Keterlihatan Kongsi Pantas Togol tetapan keterlihatan Kongsi Pantas pada telefon anda. Kongsi Pantas mungkin ditetapkan kepada tetapan yang salah, menyebabkan isu ini. Langkah 1 – Mula-mula, leret ke atas sekali untuk membuka laci apl. Langkah 2 – Setelah di sana, buka Tetapan Langkah 3 – Pergi ke halaman Tetapan dan buka tab Peranti Bersambung. Langkah 4 – Hidupkan ciri “Kongsi Pantas”. Langkah 5

Panduan Perkongsian Folder Windows 11: Kongsi Fail dan Data Anda dengan Mudah Panduan Perkongsian Folder Windows 11: Kongsi Fail dan Data Anda dengan Mudah Mar 13, 2024 am 11:49 AM

Dalam kehidupan dan kerja harian, kita selalunya perlu berkongsi fail dan folder antara peranti yang berbeza. Sistem Windows 11 menyediakan fungsi perkongsian folder terbina dalam yang mudah, membolehkan kami berkongsi kandungan yang kami perlukan dengan mudah dan selamat dengan orang lain dalam rangkaian yang sama sambil melindungi privasi fail peribadi. Ciri ini menjadikan perkongsian fail mudah dan cekap tanpa perlu risau tentang kebocoran maklumat peribadi. Melalui fungsi perkongsian folder sistem Windows 11, kami boleh bekerjasama, berkomunikasi dan bekerjasama dengan lebih mudah, meningkatkan kecekapan kerja dan keselesaan hidup. Untuk berjaya mengkonfigurasi folder kongsi, kita perlu memenuhi syarat berikut terlebih dahulu: Semua peranti (menyertai perkongsian) disambungkan ke rangkaian yang sama. Dayakan Penemuan Rangkaian dan konfigurasikan perkongsian. Ketahui peranti sasaran

Cara menggunakan NameDrop pada iPhone iOS 17 Cara menggunakan NameDrop pada iPhone iOS 17 Sep 22, 2023 pm 11:41 PM

Dengan pelancaran telefon mudah alih siri Apple iPhone15 baharu dan pelancaran sistem pengendalian mudah alih iOS17 terkini, pelbagai ciri baharu, pelarasan dan peningkatan telah dibawa ke peranti Apple. Pengguna mungkin tertanya-tanya cara menggunakan ciri NameDrop baharu pada iPhone dan iOS17. Panduan ini akan memberikan gambaran ringkas tentang cara berkongsi maklumat hubungan anda dengan cepat dan cekap menggunakan sistem NameDrop baharu yang tersedia pada iOS17. NameDrop ialah ciri yang membolehkan pengguna iPhone berkongsi maklumat hubungan mereka dengan orang lain dengan cepat. Ia adalah alat yang mudah untuk acara sosial, mesyuarat perniagaan atau perhimpunan sosial di mana anda perlu bertukar-tukar butiran hubungan dengan rakan baharu. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa NameDrop hanya berfungsi untuk menghantar kenalan baharu

Pencetak yang dikongsi tidak boleh menyambung ke pencetak Pencetak yang dikongsi tidak boleh menyambung ke pencetak Feb 22, 2024 pm 01:09 PM

Dengan perkembangan era digital, pencetak kongsi telah menjadi bahagian yang amat diperlukan dalam persekitaran pejabat moden. Walau bagaimanapun, kadangkala kita mungkin menghadapi masalah bahawa pencetak yang dikongsi tidak boleh disambungkan ke pencetak, yang bukan sahaja akan menjejaskan kecekapan kerja, tetapi juga menyebabkan beberapa siri masalah. Artikel ini bertujuan untuk meneroka sebab dan penyelesaian mengapa pencetak kongsi tidak boleh bersambung ke pencetak. Terdapat banyak sebab mengapa pencetak yang dikongsi tidak boleh menyambung ke pencetak, yang paling biasa ialah isu rangkaian. Jika sambungan rangkaian antara pencetak kongsi dan pencetak tidak stabil atau terganggu, operasi biasa tidak akan dapat dilakukan.

Bagaimana untuk melindungi privasi foto kenalan dan poster pada iPhone Bagaimana untuk melindungi privasi foto kenalan dan poster pada iPhone Sep 18, 2023 am 10:49 AM

Siapa yang boleh melihat foto kenalan dan poster anda pada iPhone? Apple menawarkan pilihan untuk memperibadikan cara anda muncul pada iPhone seseorang apabila mereka memanggil atau menghantar mesej. Pilihan termasuk Memoji, teks ringkas atau foto tersuai dengan kesan sebagai foto kenalan dan imej paparan anda. Anda bebas untuk menukar pilihan ini pada bila-bila masa dan bertukar antara profil pada kad kenalan. Selain itu, Apple memberi anda keupayaan untuk mengawal siapa yang boleh melihat dan mengakses foto atau memaparkan imej pilihan anda pada iOS17. Anda boleh memutuskan untuk berkongsi ini dengan individu yang disimpan dalam senarai kenalan anda, atau anda boleh menetapkan iPhone anda untuk menggesa anda setiap kali anda berinteraksi dengan kenalan. Jika anda mahu, anda juga boleh melumpuhkan nama secara kekal

Tamat masa menunggu kunci melebihi; cuba mulakan semula transaksi - Cara menyelesaikan ralat MySQL: tamat masa menunggu transaksi Tamat masa menunggu kunci melebihi; cuba mulakan semula transaksi - Cara menyelesaikan ralat MySQL: tamat masa menunggu transaksi Oct 05, 2023 am 08:46 AM

Lockwaittimeoutceeded;tryrestartingtransaction - Cara menyelesaikan ralat MySQL: transaction wait timeouts Apabila menggunakan pangkalan data MySQL, kadangkala anda mungkin menghadapi ralat biasa: Lockwaittimeoutexceeded;tryrestartingtransaction. Ralat ini biasanya berlaku apabila

See all articles