C# 实体框架4和事务:未提交的更改是否会影响事务中的select结果?
如果我将事务与Entity Framework 4一起使用,那么修改集上的选择会反映事务中新保存的客户id,还是会为每个客户生成相同的idC# 实体框架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
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