gpt4 book ai didi

c# - 进行多次更新时如何避免在 Entity Framework 4 中锁定数据库

转载 作者:可可西里 更新时间:2023-11-01 07:46:22 25 4
gpt4 key购买 nike

这个问题是关于使用 Microsoft Entity Framework 处理许多插入或更新的最佳实践。问题是我们编写了一个长时间运行的程序,它从数据库中提取数千条记录,然后逐条更新每条记录的单个字段。令我们沮丧的是,我们意识到这些更新的记录中的每一个都在 ObjectContext 未被释放期间被锁定。下面是一些伪代码(实际上并没有运行)来说明:

using(ObjectContext context = new ObjectContext())
{

var myRecords = context.CreateObjectSet<MyType>().AsQueryable();

foreach(var record in myRecords)
{
record.MyField = "updated!";
context.SaveChanges();

//--do something really slow like call an external web service
}
}

问题是我们需要在不考虑事务的情况下进行许多更新。我们惊讶地发现调用 context.SaveChanges() 实际上会在记录上创建锁,并且在 ObjectContext 被释放之前不会释放它。我们尤其不想锁定数据库中的记录,因为这是一个高流量系统,程序可能会运行数小时。

所以问题是:在 Microsoft Entity Framework 4 中执行许多更新而不在一个锁定数据库的长事务中全部执行所有更新的最佳方法是什么?我们希望答案不是为每次更新都创建一个新的 ObjectContext...

最佳答案

默认情况下,SQL Server 之上的 Entity Framework 使用读取已提交的事务隔离级别,事务在 SaveChanges 结束时提交。如果您怀疑其他行为,那一定是您的其余代码造成的(您使用的是 TransactionScope 吗?- 您没有在代码中显示它)或者它一定是一些错误。

另外你的做法是错误的。如果你想单独保存每条记录,你也应该分别加载每条记录。对于此类应用程序,EF 绝对是一个糟糕的选择。即使您只使用单个 SaveChange 来更新您的所有记录,它仍然会为每次更新进行一次数据库往返。

关于c# - 进行多次更新时如何避免在 Entity Framework 4 中锁定数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5330851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com