0

我必须将一些数据从 SQL Server 2008 DB 同步到 MySql DB。我正在使用 C# 和 EF 来管理数据。

流程是:从 SQL 服务器读取未同步的行,将条目(通过 EntitiesConverter 类)转换为 MySql 数据库实体,将行添加到 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 连接器异常:“MySQL 连接器/网络当前不支持分布式事务。”

我该如何解决这个问题?有没有办法在单个事务中执行此操作(“虚拟”单打事务,因为我正在使用 2 个不同的数据库)而不会出现该异常?

4

1 回答 1

0

我该如何解决这个问题?

我的车坏了,怎么解决?

抱歉,连接器不符合规范,不支持分布式事务。要么找到一种没有它们的方法,要么修复连接器,或者使用支持它们的连接器。简直就是这样。

单独的交易很复杂 - DTC 是一个非常复杂的野兽。是的,2 笔交易有效。除非它们失败——即一台机器或网络出现故障,否则你有半开放的事务(一个提交,另一个回滚)。

你可以做一个合并机制 - 仅在完成后(在提交 mysql 之后)将源中的类标记为 symced 并编写目标部分,以便它“更新”或看到已经存在的行,但这会减慢速度。

然后你可以解决它。

于 2013-01-04T08:21:44.470 回答