Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework TransactionScope如何保证跨多个数据库的数据完整性?_Entity Framework_Transactionscope - Fatal编程技术网

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

Entity framework TransactionScope如何保证跨多个数据库的数据完整性?,entity-framework,transactionscope,Entity Framework,Transactionscope,有人能告诉我TransactionScope如何保证跨多个数据库的数据完整性的原则吗?我设想它首先将命令发送到数据库,然后等待数据库响应,然后再向它们发送消息以应用先前发送的命令。然而,当发送那些apply消息时执行突然停止时,我们仍然可以得到一个应用了命令的数据库和一个没有应用命令的数据库。有人能解释一下吗 编辑: 我想我要问的是,在断电或突然关机的情况下,在写入多个数据库时,我能否依靠TransactionScope来保证数据的完整性 谢谢,巴斯 例如: using(var scop

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

编辑:

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

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

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


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

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

在某些情况下,两个数据库都必须 被告知应用他们的更改。让 比如说之后停电了 告诉第一个db应用,然后 数据库不同步。还是我 遗漏了什么


你不是。我认为这就是所谓的将军问题。可以证明,这是无法避免的。然而,失败的窗口很小。

谢谢你的回答,但我还是有点困惑。在某个时刻,必须通知两个数据库应用它们的更改。假设在通知第一个db应用后发生断电,则数据库不同步。或者我遗漏了什么?我的意思是,两个数据库都是有效的,但它们不再相互同步。我在回答中添加了更多内容。有关更多链接和资源,请参阅wikipedia链接。简言之如果您使用TransactionScope,它可以在数据库不同步的情况下工作(它们在内部也使用2PC),因此您不必担心。不过,还有更多的细节可以应用于这个答案,例如磁盘写入实际上不是原子的,这与数据库系统的假设相反,以及为了尽可能多地使用磁盘,您应该使用什么类型的硬盘()@Bas Smit:,Henrik已经为您提供了详细描述2PC工作原理的参考资料。特别是,请参阅维基百科文章底部的伯恩斯坦参考资料。您提出的问题并不新鲜,您可以(1)在2PC上阅读,如果您想知道恢复是如何工作的,或者(2)接受这些问题以前已经提出过。Henrik回答了你的问题,他不必详细说明一个相当复杂的协议的所有细节。据我所知,维基百科关于将军问题的文章,鉴于一条消息及其确认已成功交换(即发送日志中写入的任意步骤),2PC避免了不一致。如果您的网络在其中一个提交后宕机,而另一个尚未提交,则第一个网络将成功准备,另一个网络也将成功准备(否则他们将不会被告知提交),此时第一个数据库可以安全地假定第二个数据库在恢复联机时将提交。只有当您假定只有有限数量的消息可以丢失时,这才是正确的。如果所有消息可能在最糟糕的时刻丢失,那么您仍然会丢失。顺便说一句,您正在代码中执行序列化隔离事务。