FASTER 可以(轻松)用作 ACID 数据库吗?

时间:2021-07-06 12:32:37

标签: c# .net database acid

我正在尝试探索 https://github.com/Microsoft/FASTER,我想知道它是否可以轻松地用作 ACID 数据库。

目前我不确定如何轻松解决的问题是,如果其中的单个操作失败,如何“丢弃”交易。假设我有一个事务,我想将 2 个不同键 key1key2 的值更新为 value1value2.

我需要做 2 个连续的 Upserts

using var session = store.NewSession(simpleFunctions);

var r1 = await session.UpsertAsync(ref key1, ref value1);
while (r1.Status == Status.PENDING)
   r1 = await r1.CompleteAsync();

if (r1.Status != Status.Ok)
   Fail1;

var r2 = await session.UpsertAsync(ref key2, ref value2);
while (r2.Status == Status.PENDING)
   r2 = await r2.CompleteAsync();

if (r2.Status != Status.Ok)
   Fail2;

await store.TakeFullCheckpointAsync(CheckpointType.Snapshot);
await session.WaitForCommitAsync();

这里的问题是我应该在 Fail2 中做什么? Fail1 是微不足道的 - 到目前为止没有任何变化,不需要回滚任何东西。但是如果出现Fail2,我已经改了key1,需要回滚,否则数据不一致。

通常,使用 ACID 数据库,我们可以执行以下操作:

try
{
    var transaction = db.BeginTransaction();

    if (!transaction.Upsert(...))
       throw ...

    if (!transaction.Upsert(...))
       throw ...

    db.Commit();
}
catch
{
    db.Rollback();
}

我不知道如何用 FASTER 模拟它。

0 个答案:

没有答案
相关问题