【问题标题】:Entity Framework - pessimistic locking实体框架 - 悲观锁定
【发布时间】:2011-10-03 12:51:50
【问题描述】:
我要做的基本上是what NHibernate does,当您执行以下操作时:
var instance = session.Get<Customer>(id, LockMode.Upgrade);
我需要锁定数据库中的实体行。为什么我需要那个?
想象一个工作流实例,它可以由多个参与者(人或流程)同时更新。
我的约束不允许乐观锁定解决方案。
【问题讨论】:
标签:
sql-server
entity-framework-4
ef-code-first
【解决方案1】:
EF 对此不提供支持。如果您想通过查询锁定某些记录,您必须执行以下操作:
using (var scope = new TransactionScope(...))
{
using (var context = new YourContext(...))
{
var customer =
context.ExecuteStoreQuery<Customer>("SELECT ... FROM Customers WITH (UPDLOCK) WHERE ...");
// rest of your logic while record is locked
scope.Complete();
}
}
如果是 DbContext API,则为 context.Database.SqlQuery。
【解决方案2】:
如果您不想在 C# 代码中使用纯 SQL(请参阅 here),也可以将 SQL 代码移动到 EDMX 存储模型:
<Function Name="LockTestTable" IsComposable="false">
<CommandText>
SELECT NULL
FROM TestTable WITH (UPDLOCK)
WHERE TestTableID = @testTableID
</CommandText>
<Parameter Name="testTableID"
Mode="In"
Type="int" />
</Function>
然后这样称呼它
using (var scope = new TransactionScope(...))
{
using (var context = new YourContext(...))
{
context.LockTestTable(1);
// Record locked
scope.Complete();
}
}