BDB事务共享区域
最后我们来看一下事务共享区域。 首先仍然是每个进程都有的一个数据结构__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>
同样拥有一个指向描述共享区域的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>
共享区域除了有个公用的头部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>
其中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>
这个函数就是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>
其中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>
原文地址:BDB事务共享区域, 感谢原作者分享。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









ユーザーは、WallpaperEngine を使用する際に、入手した壁紙を友人と共有することができますが、多くのユーザーは、WallpaperEngine を友人と共有する方法を知りませんが、お気に入りの壁紙をローカルに保存し、ソーシャル ソフトウェアを通じて友人と共有することができます。壁紙エンジンを友達と共有する方法 答え: ローカルに保存して友達と共有します。 1. お気に入りの壁紙をローカルに保存し、ソーシャル ソフトウェアを通じて友人と共有することをお勧めします。 2. フォルダー経由でコンピューターにアップロードし、コンピューターのクリエイティブ ワークショップ機能を使用して [共有] をクリックすることもできます。 3. コンピュータでWallpaperengineを使用し、クリエイティブワークショップのオプションバーを開き、

企業専用の WeChat を使用する企業が増えています。これにより、企業と顧客およびパートナー間のコミュニケーションが容易になるだけでなく、作業効率も大幅に向上します。エンタープライズ WeChat は機能が豊富で、その中でも画面共有機能は非常に人気があります。会議中、画面を共有することで、参加者はより直感的にコンテンツを表示し、より効率的に共同作業を行うことができます。それでは、WeChat Enterprise で効率的に画面を共有する方法をまだ知らないユーザーのために、このチュートリアル ガイドで詳しく説明します。 WeChat Enterprise で画面を共有するにはどうすればよいですか? 1. Enterprise WeChat のメインインターフェイスの左側の青い領域に機能のリストが表示され、「会議」アイコンが表示され、クリックして入力すると、3 つの会議モードが表示されます。

Quick Share を使用すると、Samsung ユーザーはデバイス間でファイルを転送する時間を大幅に節約できます。しかし、Samsung Galaxy ユーザーは、携帯電話のクイックシェア機能で問題に直面していると不満を述べています。通常、クイック共有の可視性の問題がこの問題の原因となります。したがって、これは、Galaxy デバイスのクイック共有機能のトラブルシューティングに必要な唯一のガイドです。解決策 1 – クイック共有の公開設定を変更する 電話機でクイック共有の公開設定を切り替えます。クイック共有が間違った設定に設定されていることが、この問題の原因となっている可能性があります。ステップ 1 – まず、上に 1 回スワイプしてアプリドロワーを開きます。ステップ 2 – そこに到達したら、[設定] を開きます. ステップ 3 – [設定] ページに移動し、[接続されたデバイス] タブを開きます。ステップ 4 – 「クイック共有」機能をオンにします。ステップ5

日常生活や仕事では、異なるデバイス間でファイルやフォルダーを共有する必要があることがよくあります。 Windows 11 システムには便利なフォルダー共有機能が組み込まれており、個人ファイルのプライバシーを保護しながら、同じネットワーク内の他のユーザーと必要なコンテンツを簡単かつ安全に共有できます。この機能により、個人情報の漏洩を心配することなく、ファイル共有が簡単かつ効率的になります。 Windows 11 システムのフォルダー共有機能を通じて、共同作業、通信、コラボレーションがより便利になり、仕事の効率と生活の利便性が向上します。共有フォルダーを正常に構成するには、まず次の条件を満たす必要があります。 (共有に参加している) すべてのデバイスが同じネットワークに接続されている。ネットワーク探索を有効にし、共有を設定します。ターゲットデバイスを知る

新しい Apple iPhone15 シリーズ携帯電話の発売と最新の iOS17 モバイル オペレーティング システムの発売により、豊富な新機能、調整、機能強化が Apple デバイスにもたらされました。ユーザーは、iPhone と iOS17 の新しい NameDrop 機能の使用方法を疑問に思っているかもしれません。このガイドでは、iOS17 で利用できる新しい NameDrop システムを使用して連絡先情報を迅速かつ効率的に共有する方法の概要を説明します。 NameDrop は、iPhone ユーザーが自分の連絡先情報を他のユーザーとすばやく共有できる機能です。これは、新しい友人と連絡先の詳細を交換する必要がある社交イベント、ビジネス会議、または社交的な集まりに便利なツールです。ただし、NameDrop は新しい連絡先の送信にのみ機能することに注意することが重要です。

デジタル時代の発展に伴い、共有プリンターは現代のオフィス環境に欠かせないものとなっています。しかし、場合によっては共有プリンターに接続できないという問題が発生し、作業効率に影響を与えるだけでなく、トラブルが続発してしまうこともあります。この記事は、共有プリンターがプリンターに接続できない理由と解決策を探ることを目的としています。共有プリンタがプリンタに接続できない理由は数多くありますが、最も一般的なのはネットワークの問題です。共有プリンターとプリンター間のネットワーク接続が不安定または切断されると、正常に動作できなくなります。

iPhone であなたの連絡先の写真やポスターを閲覧できるのは誰ですか? Apple は、相手が電話をかけたりメッセージを送信したりするときに、その人の iPhone に自分がどのように表示されるかをカスタマイズするオプションを提供しています。オプションには、ミー文字、単純なテキスト、または連絡先の写真や表示画像として効果を備えたカスタム写真が含まれます。これらの選択はいつでも自由に変更でき、連絡先カード上のプロファイルを切り替えることができます。さらに、Apple は、iOS17 で写真を閲覧およびアクセスできるユーザーを制御したり、選択した画像を表示したりできる機能を提供します。これらを連絡先リストに保存されている個人と共有するか、連絡先とやり取りするたびにメッセージを表示するように iPhone を設定することができます。必要に応じて、名前を永久に無効にすることもできます

Lockwaittimeoutexceeded;tryrestartingtransaction - MySQL エラーの解決方法: トランザクション待機タイムアウト。MySQL データベースを使用すると、一般的なエラーが発生することがあります: Lockwaittimeoutexceeded;tryrestartingtransaction。このエラーは、トランザクション待機タイムアウトを示します。このエラーは通常、次の場合に発生します。
