前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >System|事务|Silo OCC

System|事务|Silo OCC

作者头像
朝闻君
发布2021-11-22 10:40:28
5050
发布2021-11-22 10:40:28
举报
文章被收录于专栏:用户9199536的专栏

Silo是SOSP13发表的原型数据库,目的是在众核情况下支持高性能。其核心是基于epoch的OCC提交协议,避免global TID。

Architecture

常见的SQL数据库,次级索引树存储主键。

基于MassTree作为存储引擎,MassTree是多层B+树构成的Trie树,特点在于叶子节点指向record或者子树。

作者进行了优化,例如

  • read-copy-update (RCU) 用于GC
  • version number validation
  • software prefetching of cacheline

Epoch

时间按照固定间隔的Epoch进行分段,由单工作线程进行Epoch的增加。

record由TID、上个版本数据的指针、Data组成,MVCC。

TID

每条记录都附带着TID代表最后的写事务,分为三个部分。

Epoch的目的是作为恢复的基本单元,保持All-or-nothing

Sequence的目的是保证事务串行化

Status bit分别是lock bit,lastest-version bit(是否最新),absent bit(是否删除)

Commit Protocol

OCC的思想都是直到提交时再检查数据是否有被修改

Pre-commit execution

read set存放(tuple -> tid_read),write set则存放(tuple -> value_to_write)。

Commit

一阶段 全write 置位lock bit(由全局的线程来做防止死锁),获取当前epoch

二阶段 全read检查TID是否改变(已被写)或者lock bit(正在被写)

为了避免幻读,在范围查询时还会查询整个B+ Tree叶节点的version。

三阶段 生成新的TID,并写入数据

  1. 必须大于所有read/write set
  2. 必须比本线程之前生成的TID大
  3. 使用一阶段的epoch
代码语言:javascript
复制
// Phase 1
for w, v in WriteSet {
Lock(w); // use a lock bit in TID
}
Fence(); // compiler-only on x86
e = Global_Epoch; // serialization point
Fence(); // compiler-only on x86
// Phase 2
for r, t in ReadSet {
Validate(r, t); // abort if fails
}
tid = Generate_TID(ReadSet, WriteSet, e);
// Phase 3
for w, v in WriteSet {
Write(w, v, tid);
Unlock(w);
}

Returning results

直到所有之前epoch的事务在磁盘上后再返回(相当于做checkpoint,恢复的时候只恢复最后的epoch即可)

代码语言:javascript
复制
void
txn_logger::wait_until_current_point_persisted()
{
  const uint64_t e = ticker::s_instance.global_current_tick();
  cerr << "waiting for system_sync_epoch_="
       << system_sync_epoch_->load(memory_order_acquire)
       << " to be < e=" << e << endl;
  while (system_sync_epoch_->load(memory_order_acquire) < e)
    nop_pause();
}

总结

事实上,我们可以发现

  1. 必须大于所有read/write set
  2. 必须比本线程之前生成的TID大
  3. 使用一阶段的epoch

这三条规则并没有要求事务生成绝对的全局顺序,而仅仅保证事务涉及的数据的串行化,这样能够避免访问global critical section.

另一点在于避免non-local memory writes for read operation,不是很清楚什么意思,大概是RCU的作用?

总而言之,对于多核NUMA而言,最关键的就是尽可能减少跨域内存访问,这样性能随着核数增长才会趋近线性. MCS锁也是相同的思路,在本地自旋而不是在上个节点自旋.

Reference

read-only transaction之类的细节看原文吧,作者也开源了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Architecture
  • Epoch
  • Commit Protocol
  • 总结
  • Reference
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档