【问题标题】:Entity Framework 4 and Transactions: Do uncommitted changes affect select results within a transaction?实体框架 4 和事务:未提交的更改会影响事务中的选择结果吗?
【发布时间】:2011-03-21 20:47:22
【问题描述】:

如果我像这样在 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()
}

【问题讨论】:

    标签: c# entity-framework-4 transactions


    【解决方案1】:

    仅当您在添加每个客户后致电SaveChanges 时才有效,这是非常糟糕的解决方案。这也不会在事务中运行,因为 DbTransaction 单独在通过调用 BeginTransactionDbConnection 创建之前不起作用。请改用TransactionScope

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

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

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

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

    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
    

    【讨论】:

    • 找到 TransactionScope 的示例:msdn.microsoft.com/en-us/library/bb738523.aspx。我正在使用(DbTransaction trans = _dc.Connection.BeginTransaction())。很好的答案。
    • 您说得对,实际上并没有在我的原始代码中进行交易。我添加了 TransactionScope,它现在抱怨分布式事务协调器失败。我做了规范,谷歌搜索,并尝试了响应,但到目前为止还没有。
    • 如果在范围内使用多个上下文或连接,则需要分布式事务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多