美文网首页
Silo:Speedy Transactions in Mult

Silo:Speedy Transactions in Mult

作者: upup果 | 来源:发表于2020-12-13 11:06 被阅读0次

    Silo是一种新的内存数据库,在现代多核机器上实现了优异的性能和可伸缩性。Silo的关键贡献是一个基于乐观并发控制的提交协议,它提供了可串行性,同时避免了所有共享内存中只读取记录的写操作。

    OCC

    OCC事务跟踪它在线程本地存储中读写的记录。在提交时,在确认没有并发事务的写集与读集重叠之后,事务立即执行所有写记录。如果验证失败,事务将中止。

    Epochs

    Silo基于称为epoch的时间段,用于确保可序列化的恢复,以删除垃圾并提供只读快照。每个epoch都有一个epoch号。
    全局纪元号E对所有线程都可见。指定线程定期更新E;其他线程在提交事务时访问E。E应该经常更新,因为epoch周期会影响事务延迟,但与事务持续时间相比,epoch的变化应该很少,以便通常缓存E的值。目前的实现是40毫秒更新一次;更短的时间也可以。处理E不需要锁。

    Transaction IDs

    TID是一个64 bit的integer,被分成几个部分来表示不同的含义。最高的几个位次代表当前事务提交时的epoch E。中间位次表示基于当前epoch算出来的timestamp。最低的三个bit代表lock bit,lastest-version bit,absent bit。Tid是直接写到tuple里的,每条记录都包含最近修改它的事务的TID。并满足条件:

    1. 当前epoch分配的时间戳一定小于下一个epoch分配的.
    2. 同一个工作线程中, 分配的时间戳严格单调递增.
    3. 修改同一条记录的事务, 时间戳严格单调递增.

    Data layout

    Silo的记录包含以下信息: TID word(TID加status bits),前版本指针,数据。

    Commit protocol

    当worker运行一个事务时,它维护一个读集,该读集标识所有被读取的记录,以及每条记录在被访问时的TID。对于已修改的记录,它维护一个写集,用于存储记录的新状态(而不是以前的TID)。被读取和修改的记录同时出现在读集和写集中。在正常操作中,写集中的所有记录也出现在读集中。在事务完成时,worker尝试使用以下协议提交:

    阶段1

    检查事务的写集中的所有记录,并通过获取记录的锁位来锁定每条记录。为了避免死锁,按全局顺序锁定记录。在获得所有的写锁之后,worker使用一次内存访问获取全局纪元号的快照。为了确保读到主存(而不是过期的),需要使用fence。全局纪元号的快照是提交事务的序列化点。

    阶段2

    检查事务的读集中的所有记录(其中可能包含一些已读和已写的记录)。如果某个记录的TID与其在执行过程中观察到的不同,不再是其密钥的最新版本,或者被不同的事务锁定,那么事务将释放其锁并中止。如果所有读取记录的tid不变,那么事务就允许提交,因为知道它的所有读取都是一致的。worker使用在阶段1中获得的全局纪元号的快照为事务分配一个TID。

    阶段3

    worker将其修改过的记录写入树中,并将它们的TIDs更新为上一阶段计算的事务ID。每个锁都可以在其记录被写入之后立即被释放。必须确保锁一释放,新的TID就可见。

    相关文章

      网友评论

          本文标题:Silo:Speedy Transactions in Mult

          本文链接:https://www.haomeiwen.com/subject/dxmugktx.html