代码之家  ›  专栏  ›  技术社区  ›  Bas Smit

TransactionScope如何保证跨多个数据库的数据完整性?

  •  4
  • Bas Smit  · 技术社区  · 15 年前

    我想我要问的是,在断电或突然关机的情况下,在向多个数据库写入数据时,是否可以依靠TransactionScope来保证数据的完整性。

    谢谢,巴斯

        using(var scope=new TransactionScope())
        {
            using (var context = new FirstEntities())
            {
                context.AddToSomethingSet(new Something());
                context.SaveChanges();
            }
    
            using (var context = new SecondEntities())
            {
                context.AddToSomethingElseSet(new SomethingElse());
                context.SaveChanges();
            }
    
            scope.Complete();
        }
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   usr    15 年前

    在某些时候,两个数据库都必须 被告知应用他们的改变。让 告诉第一个db申请,然后 数据库不同步。还是我

    你不是。我认为这就是所谓的将军问题。这是无法阻止的。然而,失败的窗口很小。

        2
  •  6
  •   Erwin Mayer    10 年前

    Each scope votes to commit

    这两个数据库是一致的,因为在MTC下运行的分布式COM+事务附带了数据库事务。

    如果一个数据库投票提交(例如,通过执行(:TransactionScope.commit()),“it”告诉DTC它投票提交。当所有数据库都这样做时,它们就有一个更改列表。只要数据库事务现在没有死锁或与其他事务冲突(例如通过抢占一个事务的公平算法),每个数据库的所有操作都在事务日志中。如果系统在一个数据库的“尚未提交”操作完成但另一个数据库的“尚未提交”操作完成时断电,则事务日志中已记录所有资源都已投票提交,因此从逻辑上讲,提交操作不会失败。因此,下次无法提交的数据库启动时,它将完成处于这种不确定状态的事务。