问题描述
我正在尝试探索 https://github.com/Microsoft/FASTER,我想知道它是否可以轻松地用作 ACID 数据库。
目前我不确定如何轻松解决的问题是,如果其中的单个操作失败,如何“丢弃”交易。假设我有一个事务,我想将 2 个不同键 key1 和 key2 的值更新为 value1 和 value2.
我需要做 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 模拟它。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)