大家,早安,
我们正在实现一种使用EF Core将文档存储到SqlServer的方法。
这个名为SAVE的方法由控制器的多个端点调用,并且可以从createDocument端点和另一个端点putDocument 使用。
一个额外的要求是此方法包含两个调用,将文档及其属性存储到2 个不同的存储库中,因此我们希望实现,如果对存储库的两个调用之一失败,它会回滚更改。
此外,整个代码托管在多台机器上,这就是为什么我们还实现了 macallon (GitHub) 的分布式锁库,以避免两台不同的机器同时访问/修改同一个文档。
混合使用这些解决方案是否正确?作为一个菜鸟,transactionScope已经是一个锁,从某种意义上说,在事务期间,其他机器甚至无法访问 Db 中的同一行,但请帮助我理解。谢谢
public void Save(Document document){
using var scope = new TransactionScope(TransactionScopeOption.RequiresNew,
TransactionScopeAsyncFlowOption.Enabled);
try
{
using (var lockHandler = documentLock.CreateLockForGuid(document.Guid))
{
repositoryOne.Save(document);
repositoryTwo.Save(document);
scope.Complete();
}
}
}
lockhandler 只是一个包装器,它调用distributedLock、SqlDistributedReaderWriterLock 并以document.Guid 作为其名称