【WiredTiger 内核】Connection / Session / Cursor:线程与 API 边界
内容提要
本文介绍WiredTiger存储引擎中Connection、Session、Cursor三层句柄的生命周期与线程模型。Connection独占数据库实例,Session单线程且同时仅持有一个事务,Cursor由Session拥有并共享事务上下文。文章强调多线程应共享Connection但各自持有Session,并澄清常见误解,为后续Cache与Eviction章节铺垫。
延伸解读
线程模型的工程含义
文章强调,WiredTiger 的 Session 被设计为单线程使用,同一时刻只能持有一个事务。这意味着,如果应用试图在多线程间共享一个 Session,将违反其契约,属于未定义行为,而非性能优化。正确的做法是共享 Connection,但每个线程或逻辑工作者持有自己的 Session。这一约束直接影响了 API 的使用方式,例如,不能期望在同一 Session 上并行执行两个独立事务,而应通过创建多个 Session 来实现并发。
Connection 与 Session 的关系澄清
常见误解是将 Connection 与 Session 一一对应,但实际模型是 1 个 Connection 对应多个 Session,每个 Session 下可有多个 Cursor。Connection 独占数据库实例,负责全局资源(如缓存、内部线程)的管理,而 Session 是几乎所有操作的上下文,负责事务和游标的生命周期。理解这一层级关系,有助于避免在并发编程中错误地共享 Session,或误解 Connection 的职责。
Cursor 与事务上下文的共享
同一 Session 下打开的多个 Cursor 共享该 Session 的事务上下文,这意味着它们看到的是同一事务的快照。Cursor 由创建它的 Session 拥有,不能跨 Session 使用。此外,打开 Cursor 会增加数据句柄的引用计数,阻止表被删除或重命名,因此及时关闭 Cursor 对于资源释放和避免阻塞 DDL 操作至关重要。
与 MongoDB 嵌入的衔接
文章指出,MongoDB 在启动时嵌入 WiredTiger,其线程模型与 WiredTiger 的 Session 映射关系属于嵌入层调度,不能简单地将一个 TCP 连接等同于一个 WT Session。理解 WiredTiger 的线程约束有助于排查 MongoDB 中的并发问题,例如,如果 MongoDB 的某个逻辑会话在多个线程间共享,可能会违反 WiredTiger 的单线程契约。后续章节将深入探讨 MongoDB 如何映射逻辑会话到 WT Session,以及长游标对历史回收的影响。
Q&A
WiredTiger中Connection、Session、Cursor三者的关系是什么?
Connection是数据库实例句柄,独占数据库,一个进程通常只有一个;Session是操作上下文,由Connection创建,一个Connection可有多个Session,但一个Session只属于一个Connection;Cursor由Session创建,一个Session可有多个Cursor,它们共享该Session的事务上下文。
WiredTiger中Session的线程模型是怎样的?为什么不能多线程共用一个Session?
WiredTiger规定一个Session必须单线程使用,同一Session不能被多线程并发调用。因为一个Session同时最多持有一个运行中事务,且该事务只属于该Session。多线程共用一个Session会违反单线程契约,属于未定义用法,不是性能技巧。正确做法是多线程共享Connection,但每个线程持有自己的Session。
WiredTiger中如何实现多线程并发访问数据库?
多线程应共享同一个Connection,但每个线程(或逻辑工作者)持有自己的Session。每个Session单线程使用,可并行执行事务。
WiredTiger中Cursor的所有权归谁?多个Session能否共享同一个Cursor?
Cursor由创建它的Session拥有,只能被该Session使用。即使其他Session已打开同一文件,本Session仍有自己的Cursor实例。因此,多个Session不能共享同一个Cursor。
WiredTiger中一个Session能同时开启多个事务吗?
不能。一个Session在任意时刻最多持有一个运行中事务,且该事务只属于该Session。要并行多个事务,需要开多个Session。
WiredTiger中Connection、Session、Cursor是否计入cache_size?
不计入。dhandle、cursor、session不计入cache计量,它们仍占进程堆,但不计入cache_size配额。
WiredTiger中关闭Session时会发生什么?
WT_SESSION::close会回滚仍活跃的事务并关闭仍打开的cursor。关闭Connection也会关闭全部Session。
WiredTiger中Connection的初始化过程包括哪些步骤?
初始化过程包括:解析配置(eviction、logging、checkpoint、cache、statistics等);按create决定建库或打开已有库,检查必需文件,损坏时返回错误;启动内部工作线程(statistics、logging、eviction、checkpoint、cache管理、sweep server);在connection就绪前执行rollback to stable。