bdb mvcc: buffer 何时可以被 看到; mvcc trans何时被移除
# 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(®ion->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(®ion->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(®ion->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何时被移除的更多相关文章
- MVCC原理 4步 什么是MVCC、事务ACID、事物隔离级别、Innodb存储引擎是如何实现MVCC的
MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写.事物A 原子性C 一致性I 隔离性D 持久性高并发的场景下的问题脏读不可重复读幻读事物隔离级别RU读未提交 脏读/不可重复读/幻读 .不适用 ...
- Innodb 实现高并发、redo/undo MVCC原理
一.并发控制 因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全. 可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...
- h2database源码浅析:锁与MVCC
Table Level Locking The database allows multiple concurrent connections to the same database. To mak ...
- 关于 MVCC 的基础
作为第一篇对 MVCC 的学习材料,以下内容翻译自 Wikipedia. 1. 什么是MVCC 1.1 基础概念 MVCC,Multi-Version Concurrency Control,多版本并 ...
- mysql事务隔离级别和MVCC
一.三种问题: 脏读(Drity Read):事务A更新记录但未提交,事务B查询出A未提交记录. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次 ...
- Mysql 中的MVCC原理,undo日志的依赖
一. MVCC 原理了解 原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...
- 关于 MVCC 的基础【转】
1. 什么是MVCC 1.1 基础概念 MVCC,Multi-Version Concurrency Control,多版本并发控制.MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据 ...
- 【数据库】悲观锁与乐观锁与MySQL的MVCC实现简述
悲观锁 悲观锁,就是一种悲观心态的锁,每次访问数据时都会锁定数据: 乐观锁 乐观锁,就是一种乐观心态的锁,每次访问数据时并不锁定数据,期待数据并没作修改,如果数据没被修改则作具体的业务 应用程序上使用 ...
- MySQL的MVCC
基本概念 Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问:在编程语言中实现事务内存. ...
随机推荐
- 理解View与Model分离
说实话MV*架构中,Model与View分离已经听人谈了好久,但是以前始终没太弄懂什么意思,最近终于稍微懂了一些,虽然不一定很对,暂且先记录下来. 谈Model与View分离,首先要弄懂页面在前端渲染 ...
- Python——函数中的关键字参数
关键字参数 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple.而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict.请看 ...
- redis配置文件redis.conf说明
redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no2. 当Redis以守护进程方式运行时, ...
- hdu 1455 Sticks(dfs+剪枝)
题目大意: George有许多长度相同的木棍,随机的将这些木棍砍成小木条,每个小木条的长度都是整数单位(长度区间[1, 50]).现在George又想把这些小木棒拼接成原始的状态,但是他忘记了原来他有 ...
- 在Android项目中引入MuPdf
由于公司手机App要加入一个附件查看功能,需要查看PDF文件,在网上找了许多第三方工具,最后选择了MuPDF. 更多第三方工具可以查看大神总结的:http://www.cnblogs.com/poke ...
- MAC 安装 Protobuf
1.确认MAC装有g++.make.vim工具 2.安装make工具使用 brew install make 3.安装protobuf brew install protobuf 4.安装 ...
- css之absolute绝对定位(技巧篇)
无依赖的绝对定位 margin,text-align与绝对定位的巧妙用法 例子1:实现左右上角的图标覆盖,如图,
- curl详解
用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...
- 在Visual Studio 2012 Blue theme下使用Dark theme的文本编辑器颜色设置
Visual Studio 2012 默认提供了3种color theme: blue,light,和dark.其中dark的文本编辑器颜色设定很爽,可是整个菜单项加上一些小的窗口如Find Resu ...
- android app上线后bug的处理
app上线后,后期维护显得尤为重要,今天给大家分享一下app上线后出现bug后的解决方法 1.继承Application类,重写onCreate方法 import java.io.File; impo ...