考虑
foreach (var myEntity in myEntities)
{
using (TransactionScope scope = new TransactionScope())
{
// Some not very important code
myEntity.ImageUrl = FixUrl(myEntity.ImageUrl);
MyEntity additionalEntity = Clone(myEntity);
additionalEntity.DateCreated = DateTime.Now;
additionalEntity.CreatedBy = GetCurrentUser();
//Step 1
serverDbContext.Update(myEntity);
//Step 2
AddToQueue(myEntity);
//Step 3
anotherserverDbContext.Insert(myEntity);
scope.Complete();
}
}
请注意,TransactionScope 是在 foreach 语句中创建的。对这段代码的实验证实了事务范围是昂贵的操作。
预计 AddToQueue 有时可能会抛出异常。在这种情况下,我们不希望在 server1 数据库和 server2 数据库中对该实体进行任何更改。
如果没有事务范围,此代码将在几秒钟内执行,而在执行时使用则需要永远。我真正想要的是在 1,2 或 3 步骤中的任何一个出现异常的情况下仍然能够不更改基础记录。
显然,将 foreach 移到using中是不够的,因为如果至少有一次循环失败,那么好的记录也可能会被破坏,并且不会更新任何内容。
我需要了解更多关于交易机制的信息或可以在这里尝试哪些其他方法?