今天简单介绍下openGauss的MOT中,session与transantion的关系.一个session,对应着一个用户连接,比如说一个JDBC的connection.通常,在一个session周期内,同时只能执行一个事务,只有当前的事务执行完,才能处理下一个事务,如果存在多个用户连接,即session,就会有多个并发的事务.一个session中所有的事务,都是用同一个TxnManager(负责管理事务执行的类),每完成一个事务,TxnManger就会调用CleanUp函数,清空m_roeSet数据结构.下一次来新的事务时,TxnManger就像是刚初始化一样,之前事务的一切痕迹都没有了.TxnManager中有一个内部ID,在执行CleanUp时,会自增1,可以知道一共执行过多少个事务.MOT是NUMA内存感知的,他的所有内存都是统一NUMA节点分配的,TxnManager在初始化时依赖于Session的上下文,所以他们的关系是很密切的.下面是部分源码的注释.
if (!u_sess->mot_cxt.txn_manager) {
bool attachCleanFunc =
(MOTCurrThreadId == INVALID_THREAD_ID ? true : !g_instance.attr.attr_common.enable_thread_pool);
// 确保引擎是已经初始化过的
if (m_engine == nullptr) {
elog(ERROR, "initTxnManager: MOT engine is not initialized");
return nullptr;
}
// 创建新的session上下文,engine中有一个sessionManager负责上下文的创建
MOT::SessionContext* session_ctx =
MOT::GetSessionManager()->CreateSessionContext(IS_PGXC_COORDINATOR, 0, nullptr, connection_id);
if (session_ctx == nullptr) {
MOT_REPORT_ERROR(MOT_ERROR_INTERNAL, "Session Initialization", "Failed to create session context");
ereport(FATAL, (errmsg("Session startup: failed to create session context.")));
return nullptr;
}
//记录session信息
RecordSessionDetails();
if (attachCleanFunc) {
// 上下文未被使用时会被清理
if (!g_instance.attr.attr_common.enable_thread_pool) {
on_proc_exit(DestroyTxn, PointerGetDatum(session_ctx));
ScheduleSessionCleanup();
} else {
on_proc_exit(MOTCleanupThread, PointerGetDatum(nullptr));
MOT_LOG_DEBUG("Registered current thread for proc-exit callback for thread %p", (void*)pthread_self());
}
}
//将新的TxnManager传给MOT用户的session
u_sess->mot_cxt.txn_manager = session_ctx->GetTxnManager();
网友评论