有人可以告诉我TransactionScope如何保证跨多个数据库的数据完整性的原则吗?我想它首先将命令发送到数据库,然后等待数据库响应,然后向它们发送消息以应用先前发送的命令。但是,当发送这些应用消息时突然停止执行时,我们仍然可以使用已应用该命令的数据库和未应用该命令的数据库。任何人都可以对此有所了解吗?
修改
我想我要问的是,在断电或突然关机的情况下写入多个数据库时,我可以依靠TransactionScope来保证数据的完整性。
谢谢,Bas
示例:
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();
}
答案 0 :(得分:6)
如果它检测到多个数据库使用每个作用域作为两阶段提交的一部分,则将其提升为分布式事务处理协调器(msdtc)。 Each scope votes to commit因此我们得到了ACID属性,但是在数据库中分布。它还可以与TxF,TxR集成。您应该能够按照您描述的方式使用它。
这两个数据库是一致的,因为在MTC下运行的分布式COM +事务附加了它们,数据库事务。
如果一个数据库投票提交(例如通过执行(:TransactionScope).Commit()),“它”告诉DTC它投票提交。当所有数据库都完成此操作后,他们会有一个更改列表。就数据库事务而言,现在不会死锁或与其他事务冲突(例如,通过抢占一个事务的公平算法),每个数据库的所有操作都在事务日志中。如果系统在尚未提交一个数据库已经完成但是已经完成另一个数据库时失去了电源,那么它已被记录在事务日志中,所有资源都已投票提交,因此没有逻辑暗示提交应该失败。因此,下次无法提交的数据库启动时,它将完成处于此不确定状态的那些事务。
答案 1 :(得分:2)
对于分布式事务,实际上可能会发生数据库变得不一致的情况。你说:
在某些时候,两个数据库都必须这样做 被告知要应用他们的更改。让我们 说以后停电了 告诉第一个数据库应用,然后 数据库不同步。或者我 遗失了什么?
你不是。我认为这被称为将军问题。它可以证明是不可避免的。然而,失败的窗口非常小。