C# 实体框架4和事务:未提交的更改是否会影响事务中的select结果?

C# 实体框架4和事务:未提交的更改是否会影响事务中的select结果?,c#,entity-framework-4,transactions,C#,Entity Framework 4,Transactions,如果我将事务与Entity Framework 4一起使用,那么修改集上的选择会反映事务中新保存的客户id,还是会为每个客户生成相同的id using ( System.Data.Common.DbTransaction trans = new DbTransaction() ) { foreach( var customer in CustomersToSave ) { // Calculate lowest ID available var

如果我将事务与Entity Framework 4一起使用,那么修改集上的选择会反映事务中新保存的客户id,还是会为每个客户生成相同的id

using ( System.Data.Common.DbTransaction trans = new DbTransaction() )
{
    foreach( var customer in CustomersToSave )
    {  
        // Calculate lowest ID available
        var id_Query =  (from c in Customers
                     select c.ID).Distinct();
        var lowest_ID_Available = 
            (from p1 in id_Query
             from p2 in id_Query.Where(a => a == p1 + 1).DefaultIfEmpty()
             where p2 == 0
             select p1).Min();

        ... Create a customer with the lowest_ID_Available
    }

    trans.Commit()
}

只有在添加每个客户后调用
SaveChanges
时,这才有效,这是一个非常糟糕的解决方案。此外,这不会在事务中运行,因为只有通过调用
BeginTransaction
DbConnection
创建,才能单独使用
DbTransaction
。改用
TransactionScope

另一个问题是并发性。根据您的事务隔离级别,其他并发事务将等待此事务完成,或者将能够使用与当前事务相同的ID

这通常由单独的表处理,该表只包含计数器。您将创建存储过程以获取给定键(表名)的下一个计数器。该过程将使用原子更新,原子更新将同时设置返回值和递增当前计数器

本程序的使用取决于您的要求。如果您需要生成的数字的连续序列(没有回滚的孔),那么您必须仅为当前事务锁定此特殊表中的记录。若您的需求只是获取唯一的编号,但不需要无孔序列,那个么您可以使用并发访问

存储过程锁定记录的示例(如果不需要锁定update语句中的删除提示):


找到TransactionScope的示例:。我正在使用(DbTransaction trans=\u dc.Connection.BeginTransaction()。回答得很好。你说得对,在我的原始代码中没有实际执行事务。我添加了TransactionScope,它现在抱怨分布式事务协调器失败。我做了规范,搜索了它,并尝试了响应,但到目前为止还没有。如果在范围中使用多个上下文或连接,则需要分布式事务。
CREATE PROCEDURE [dbo].[GetNextSequenceValue]
    @SequenceType VARCHAR(20)
AS
BEGIN
    DECLARE @Result INT

    UPDATE [dbo].[Sequences] WITH (ROWLOCK, UPDLOCK)
    SET @Result = Value = Value + 1
    WHERE SequenceType = @SequenceType

    RETURN @Result
END