0

关于实体框架如何参与 DTC 事务的快速(我认为)问题。

如果我在同一个分布式事务中创建两个 DbContext,我保存在第一个上下文中的数据是否可以通过第二个上下文提供给后续查询?

换句话说,在 DTC 事务中:我通过 context1 获取、更改和保存数据,然后创建 context2 并查询相同的实体。context1 中未提交的数据是否对 context2 可用?

4

2 回答 2

0

看来第二个上下文确实可以看到第一个上下文所提交的更改。我们正在使用读提交隔离。我本质上是在做(伪代码):

Start Distributed Transaction

Context1: Fetch data into entities
Context1: Change entities
Context1: Save entities

Context2: Fetch data into same entities as used context 1
Context2: Change entities
Context2: Save entities

Commit Distributed Transaction

当我进入上下文 2 时,我确实看到了保存在上下文 1 中的更改,即使它们没有提交(通过 DTC)。

于 2013-02-28T16:48:05.233 回答
0

这取决于您使用的隔离级别。

如果您要将 DbContexts 包含在TransactionScope中并指定 IsolationLevel.ReadUncommitted,例如

var options = new TransactionOptions{ IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
using(var scope= new TransactionScope(TransactionScopeOption.Required, options))
{
    ... DbContexts here

    scope.Complete();
}

然后您的第二个查询将能够看到第一个查询所做的更改。对于其他隔离级别,他们不会。

SQL Server 的默认隔离级别是 Read Committed,但TransactionScope的默认隔离级别是 Serializable。

有关一些示例,请参见http://www.gavindraper.co.uk/2012/02/18/sql-server-isolation-levels-by-example/

于 2013-02-27T23:14:34.407 回答