4

有人能告诉我 TransactionScope 如何保证跨多个数据库的数据完整性的原理吗?我想它首先将命令发送到数据库,然后等待数据库响应,然后再向它们发送消息以应用之前发送的命令。然而,当发送这些应用消息时突然停止执行时,我们仍然可能最终得到一个应用了命令的数据库和一个没有应用命令的数据库。任何人都可以对此有所了解吗?

编辑:

我想我要问的是在断电或突然关机的情况下写入多个数据库时,我是否可以依靠 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();
    }
4

2 回答 2

6

如果它检测到多个数据库将每个范围用作两阶段提交的一部分,它会将其提升到分布式事务协调器 (msdtc)。每个范围都投票提交,因此我们获得了 ACID 属性,但分布在整个数据库中。它还可以与 TxF、TxR 集成。您应该能够按照您描述的方式使用它。

这两个数据库是一致的,因为在 MTC 下运行的分布式 COM+ 事务已附加到它们,即数据库事务。

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

于 2010-03-08T12:03:37.250 回答
2

对于分布式事务,实际上可能会发生数据库变得不一致的情况。你说:

在某些时候,必须告知两个数据库应用它们的更改。可以说在告诉第一个数据库应用后断电,然后数据库不同步。还是我错过了什么?

你不是。我认为这被称为将军问题。它可以证明是无法阻止的。然而,失败的窗口很小。

于 2010-03-08T15:03:18.327 回答