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

Bas*_*mit 4 entity-framework transactionscope

有人能告诉我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();
    }
Run Code Online (Sandbox Code Playgroud)

Hen*_*rik 6

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

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

如果一个数据库投票提交(例如通过执行(:TransactionScope).Commit()),"它"告诉DTC它投票提交.当所有数据库都完成此操作后,他们会有一个更改列表.就数据库事务而言,现在不会死锁或与其他事务冲突(例如,通过抢占一个事务的公平算法),每个数据库的所有操作都在事务日志中.如果系统在尚未提交一个数据库已经完成但是已经完成另一个数据库时失去了电源,那么它已被记录在事务日志中,所有资源都已投票提交,因此没有逻辑含义,即提交应该失败.因此,下次无法提交的数据库启动时,它将完成处于此不确定状态的那些事务.