検討
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();
}
}
foreach ステートメント内で TransactionScope が作成されることに注意してください。このコードを試してみると、transcaction スコープはコストのかかる操作であることが確認されました。
AddToQueue が例外をスローする場合があることが予想されます。この場合、そのエンティティに関して server1 データベースにも server2 データベースにも変更を加える必要はありません。
トランザクション スコープがない場合、このコードは数秒で実行されますが、on 実行を使用すると永遠に時間がかかります。私が本当に探しているのは、1、2、または 3 つのステップのいずれかで例外が発生した場合に、基になるレコードを変更できないようにすることです。
ループの少なくとも 1 つのパスが失敗すると、適切なレコードも壊れて何も更新されない可能性があるため、明らかに foreach をusing内で移動するだけでは十分ではありません。
トランザクションのメカニズムや、ここで試すことができるその他のアプローチについてさらに知る必要があることは何ですか?