我有两个数据库和两个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事务?或者也许我的交易方式不正确?
答案 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()
}