0

検討

   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内で移動するだけでは十分ではありません。

トランザクションのメカニズムや、ここで試すことができるその他のアプローチについてさらに知る必要があることは何ですか?

4

1 に答える 1