作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有以下可以修改同一数据集的进程:
当两个进程同时修改父/子数据集时,建议采用哪些方法来确保保持数据完整性(C# Lock 语句不起作用,因为它的代码运行在不同的进程中)。
目前他们正在使用 Entity Framework ,该过程会将数据集加载到内存中,处理数据,然后保存它。问题在于,数据在被进程 B 最初读取后,可能会被其他进程 A 更改。
数据位于 SQL Azure 数据库中。
我可以在父表记录(Id = XXXX)上创建阻塞事务吗,这样其他进程只需等待锁被释放。如何最好地做到这一点?
否则,也许我脑海中浮现的一些其他想法可能是在父记录上设置“锁定”字段,或者检查父 UNION 与每个子表(对于父 ID)的 MAX RowVersion 并检查此每次更改之前和之后的 RowVersion?
最佳答案
sp_getapplock存储过程似乎正是您所需要的。
当您想要同步需要独占访问数据库一部分的进程时,它非常有用。
这应该类似于下面的内容。其中 ctx
是 DbContext
,并且您要同步的每个进程都使用相同的共享逻辑名称字符串“MYLOCKNAME”,或您想要的任何内容。
using (var tran = ctx.Database.BeginTransaction())
{
try
{
const string lockName = "MYLOCKNAME";
var resourceParam = new SqlParameter("Resource", SqlDbType.NVarChar, 255) { Value = lockName };
var lockModeParam = new SqlParameter("LockMode", SqlDbType.NVarChar, 32) { Value = "Transaction" };
ctx.Database.ExecuteSqlCommand("EXEC sp_getapplock @Resource, @LockMode", resourceParam, lockModeParam);
// Do stuff with ctx
// ...
tran.Commit();
}
catch
{
tran.Rollback();
}
}
关于c# - 悲观地锁定进程之间的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625559/
我正在编写一个 Web 应用程序,两个不同的用户可以在其中更新事物列表,例如待办事项列表。我已经意识到,乐观锁定机制效果最好,因为我不希望出现高争用情况。 我一直在查看事务隔离级别,现在我有点困惑。看
我是一名优秀的程序员,十分优秀!