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つの異なるデータベースで作業しているため「仮想」単一トランザクション)でこれを行う方法はありますか?