如何正确地处理多个上下文和多个数据库的事务

时间:2015-10-02 08:42:03

标签: sql-server entity-framework transactions entity-framework-6

我有两个数据库和两个datacontexts(我使用的是代码优先方法)。所以代码:

using (var tr1 = internalDb.Database.BeginTransaction())
using (var tr2 = externalDb.Database.BeginTransaction())
{
    try
    {
        //Some changes to internalDb (inserted)
        //Some changes to externalDb (update, deleting some values)

        internalDb.SaveChanges();
        externalDb.SaveChanges();
        tr1.Commit();
        tr2.Commit();
    }
    catch (Exception exc)
    {
        tr1.Rollback();
        tr2.Rollback();
        _log.Error(exc);
    }

一切都运行正常,但有一次我遇到了事件:在进程中间的某个地方,我有非常短的(5秒)网络故障事件。回滚后,从externalDb,tr2删除的数据被破坏 - 丢失了一大块数据(我不知道:可能是128个字母,可能还有一些)。

所以我想知道:它怎么可能?实体框架事务!= SQL事务?或者也许我的交易方式不正确?

1 个答案:

答案 0 :(得分:0)

  

也许我的交易方式不正确?

您需要分布式交易。微软有MSDTC。正确配置后,可以使用TransactionScope

在.NET中自动使用
Using scope As New TransactionScope()
{
    try
    {
        //Some changes to internalDb (inserted)
        //Some changes to externalDb (update, deleting some values)

        internalDb.SaveChanges();
        externalDb.SaveChanges();
    }
    catch (Exception exc)
    {
        _log.Error(exc);
    }
scope.Complete()
}