UPD:我试图重新表述它,因为有 2 票支持“关闭”
请建议类似这样的模式。
您需要将其写入2个不同的表,甚至写入2个不同的数据库。如果在第二种情况下没有发生记录,则回滚所有内容并返回错误。
它要么记录一切,要么什么也不记录。
public async Task SendAsync(IDefinerResult definerResult)
{
if (definerResult.DefinedLinks.Count != 0)
{
await definedLinkDAL.InsertAsync(definerResult.DefinedLinks);
}
if (definerResult.NotDefinedLinks.Count != 0)
{
await notDefinedLinkDAL.InsertAsync(definerResult.NotDefinedLinks);
}
}
一般情况下,使用DB事务。这是您可以做的最简单的事情。数据库中的事务已经发展了很多年;它是一个经过深思熟虑的机制。如果将两个操作包装在一个事务中,则原子性和完整性将得到保证:要么两个操作都将被执行,要么两个操作都不被执行。仅执行一个动作而没有执行第二个动作的状态是不会出现的。
如果你自己在代码中实现事务机制,则需要付出很大的努力;实现原子性和完整性并不那么容易。
可以在我上面提供的链接中找到用于处理事务的更详细的代码示例。请务必阅读有关异步的部分,特别是有关此参数的内容:
PS“在两个不同的数据库中”会稍微复杂一些。理论上,您需要在每个数据库中单独打开事务,并且在出现问题时同时回滚它们。但从理论上讲,当您提交一项事务时,可能会出现一种情况,之后您的连接断开,只剩下一个已提交的事务,而第二个事务自动回滚。
当然,还有
DbLink
-i,但它们在工业服务器上并不是很流行,我不确定是否可以在一个事务中对本地数据库和通过链接连接的数据库进行查询。是的,而且也不太可靠。一般来说,所有工作都在一个数据库中进行会更好。