0

SQL Server2008DBからMySqlDBにいくつかのデータを同期する必要があります。データの管理にC#とEFを使用しています。

フローは次のとおりです。SQLサーバーから同期されていない行を読み取り、エントリを(EntitiesConverterクラスを介して)MySql dbエンティティに変換し、MySqlに行を追加し、SQL行を同期済みとしてマークします(両方のコンテキストで変更を保存します)。

コード:

public static int SyncAttivitaToHiPlan(int start, int? end)
    {

        var options = new TransactionOptions();
        options.IsolationLevel = IsolationLevel.Serializable;

        using (var scope = new TransactionScope(TransactionScopeOption.Required, options))
        {
            //MySql ObjectContext
            var hpContext = new hiplanEntities1();

            //SQL Server ObjectContext
            var otoContext = new OTOCOMMEntities1();

            var otoProvider = OtoCommEntitiesProvider.GetInstance();

            IEnumerable<Attivita> attivitaEntries;

            if (end == null)
                attivitaEntries = otoProvider.GetUnsyncedAttivita(start);
            else
                attivitaEntries = otoProvider.GetUnsyncedAttivita(start, (int)end);

            var tvavalavs = new ConcurrentQueue<tvavalav>();
            //ObjectContext is not thread-safe
            //attivitaEntries.AsParallel().AsOrdered().ForAll((a) => tvavalavs.Enqueue(EntitiesConverter.BuildTvavalavFromAttivita(a)));
            foreach (var a in attivitaEntries)
            {
                tvavalavs.Enqueue(EntitiesConverter.BuildTvavalavFromAttivita(a));
            }


            foreach (var t in tvavalavs)
            {
                hpContext.tvavalav.AddObject(t);
            }

          //  attivitaEntries.AsParallel().ForAll((a) => a.Synced = true);
            foreach (var a in attivitaEntries)
            {
                a.Synced = true;
            }
            hpContext.SaveChanges();
            otoContext.SaveChanges();

        }
        return 0; //TODO: return the number of synced rows.
    }

}

試してみると、MySql Connector例外が発生します:「MySQLConnector/Netは現在分散トランザクションをサポートしていません。」

どうすればこれを解決できますか?その例外を取得せずに、単一のトランザクション(2つの異なるデータベースで作業しているため「仮想」単一トランザクション)でこれを行う方法はありますか?

4

1 に答える 1

0

どうすればこれを解決できますか?

私の車は壊れています、どうすればこれを解決できますか?

申し訳ありませんが、cnnectorは仕様に準拠しておらず、分散トランザクションをサポートしていません。それらなしでそれを行う方法を見つけるか、コネクタを修正するか、それらをサポートするものを使用します。単にそのように。

個別のトランザクションは複雑です-DTCはVEYの複雑な獣です。はい、2つのトランザクションが機能します。それらが失敗しない限り、つまりマシンまたはネットワークがダウンしない限り、半分開いているトランザクションがあります(1つはコミットされ、もう1つはロールバックされます)。

あなたはマージメカニズムを行うことができます-これが行われたとき(mysqlをコミットした後)にのみソース内のクラスをsymcedとしてマークし、ターゲット部分を書き込んで、行がすでに存在することを「更新」または確認しますが、それはスローダウンします。

その後、それを回避することができます。

于 2013-01-04T08:21:44.470 に答える