# txn.h

struct __db_txnregion
SH_TAILQ_HEAD(__active) active_txn;
SH_TAILQ_HEAD(__mvcc) mvcc_txn; # txn.c, __txn_begin_int(), txn 加入的 buffer version 不可以被看见.
MAX_LSN(td->visible_lsn); __txn_commit(txn, flags), commit时, td->visible_lsn 被设置, 意味着 从此时起, 此txn 加入的 buffer version 可以被看见了.
...
if (DBENV_LOGGING(env) && (!IS_ZERO_LSN(td->last_lsn) ||
STAILQ_FIRST(&txn->logs) != NULL)) {
if (txn->parent == NULL) {
...
if (ret == && !IS_ZERO_LSN(td->last_lsn)) {
ret = __txn_flush_fe_files(txn);
if (ret == )
ret = __txn_regop_log(env, txn,
&td->visible_lsn, LOG_FLAGS(txn),
TXN_COMMIT,
(int32_t)time(NULL), id,
request.obj); txn_end(): trans从active queue里移除, 如果其向 cache 加入了 mvcc page buffer, 则放入mvcc queue中.
TXN_SYSTEM_LOCK(env);
td->status = is_commit ? TXN_COMMITTED : TXN_ABORTED;
SH_TAILQ_REMOVE(&region->active_txn, td, links, __txn_detail);
...
if (txn->parent != NULL) {
ptd = txn->parent->td;
SH_TAILQ_REMOVE(&ptd->kids, td, klinks, __txn_detail);
} else if ((mvcc_mtx = td->mvcc_mtx) != MUTEX_INVALID) {
MUTEX_LOCK(env, mvcc_mtx);
if (td->mvcc_ref != ) {
SH_TAILQ_INSERT_HEAD(&region->mvcc_txn,
td, links, __txn_detail); # txn_region.c __txn_remove_buffer(), 若 mvcc txn 创建的buffer 全部被移除, 则此txn可以free MUTEX_LOCK(env, td->mvcc_mtx);
DB_ASSERT(env, td->mvcc_ref > ); /*
* We free the transaction detail here only if this is the last
* reference and td is on the list of committed snapshot transactions
* with active pages.
*/
need_free = (--td->mvcc_ref == ) && F_ISSET(td, TXN_DTL_SNAPSHOT);
MUTEX_UNLOCK(env, td->mvcc_mtx); if (need_free) {
MUTEX_UNLOCK(env, hash_mtx); ret = __mutex_free(env, &td->mvcc_mtx);
td->mvcc_mtx = MUTEX_INVALID; TXN_SYSTEM_LOCK(env);
SH_TAILQ_REMOVE(&region->mvcc_txn, td, links, __txn_detail);
STAT_DEC(env,
txn, nsnapshot, region->stat.st_nsnapshot, td->txnid);
__env_alloc_free(&mgr->reginfo, td);
TXN_SYSTEM_UNLOCK(env); MUTEX_READLOCK(env, hash_mtx);
} return (ret);
}

bdb mvcc: buffer 何时可以被 看到; mvcc trans何时被移除的更多相关文章

  1. MVCC原理 4步 什么是MVCC、事务ACID、事物隔离级别、Innodb存储引擎是如何实现MVCC的

    MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写.事物A 原子性C 一致性I 隔离性D 持久性高并发的场景下的问题脏读不可重复读幻读事物隔离级别RU读未提交 脏读/不可重复读/幻读 .不适用 ...

  2. Innodb 实现高并发、redo/undo MVCC原理

    一.并发控制   因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全.   可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...

  3. h2database源码浅析:锁与MVCC

    Table Level Locking The database allows multiple concurrent connections to the same database. To mak ...

  4. 关于 MVCC 的基础

    作为第一篇对 MVCC 的学习材料,以下内容翻译自 Wikipedia. 1. 什么是MVCC 1.1 基础概念 MVCC,Multi-Version Concurrency Control,多版本并 ...

  5. mysql事务隔离级别和MVCC

    一.三种问题: 脏读(Drity Read):事务A更新记录但未提交,事务B查询出A未提交记录. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次 ...

  6. Mysql 中的MVCC原理,undo日志的依赖

    一. MVCC 原理了解   原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...

  7. 关于 MVCC 的基础【转】

    1. 什么是MVCC 1.1 基础概念 MVCC,Multi-Version Concurrency Control,多版本并发控制.MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据 ...

  8. 【数据库】悲观锁与乐观锁与MySQL的MVCC实现简述

    悲观锁 悲观锁,就是一种悲观心态的锁,每次访问数据时都会锁定数据: 乐观锁 乐观锁,就是一种乐观心态的锁,每次访问数据时并不锁定数据,期待数据并没作修改,如果数据没被修改则作具体的业务 应用程序上使用 ...

  9. MySQL的MVCC

    基本概念 Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问:在编程语言中实现事务内存. ...

随机推荐

  1. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    控制台包空指针后跟这个异常,是因为控制层调用service时的失败,无法读到sql,问题在于controller在引入的service没有自动装配,在引入多个service时,每个service都要自 ...

  2. linux 账号管理与ACL权限设定

    此文涉及命令:useradd.usermod.userdel.passwd.chage.setfacl.getfacl.su.sudo.fingr.chfn.chsh.id.groupadd.grou ...

  3. 使用PS过程

    1. 设置图层背景色和前景色 设置背景色和前景色方法类似,下面以设置背景色为例说明.方法一:使用色板设置图片背景色第一步:单击"文件"菜单,选择"新建文档",这 ...

  4. textFiled的placeHolder字体颜色

    self.title=@"修改UITextField的placeholder字体颜色"; UITextField *textTF=[[UITextField alloc]initW ...

  5. JavaWeb 学习001-登录页面-Servlet

    那什么是Servlet呢? 我理解的Servlet 就是一个中间媒介,jsp页面原本需要一些操作,但是现在让jsp页面只是显示就好,把操作的工程转移给Servlet中. 使用Servlet时候有个固定 ...

  6. windows10, 安装wamp无法启动服务的问题

    今天在另一台电脑上安装了wamp, 就是这个玩意 结果怎么也启动不起来, 上网上查了一下, 原因是有些windows10的系统上有安装IIS10, 这个也不知道是啥东西, 占用了80端口, 所以启动不 ...

  7. Java 工具集

    在 sudo -u tomcat 状态下执行 1. jstack jstack pid >> file : 打印当前 thread stack 状态 CPU 高分析流程 使用jstack分 ...

  8. CSS自动换行

    style="word-break:break-all;word-wrap:break-word;"

  9. 实用的PHP功能详解(一)_php glob()用法

    一.使用glob()查找文件 大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到 glob() 的时候,你也许并不知道这是用来做什么的,其实glob()和scandir() 一样,可以用来 ...

  10. php count函数

    最近被问到一个函数count 1.count("123456") 对应的输出是什么? 2.count(null) 对应的输出是什么? 以前没有认真的考虑,只是心里有一个印象那就是c ...