当前位置:  开发笔记 > 数据库 > 正文

悲观与乐观并发(锁定与反馈)

如何解决《悲观与乐观并发(锁定与反馈)》经验,为你挑选了1个好方法。

我正在使用以下标准构建应用程序:

工作项目:需要由用户通过网络手动处理的项目(简短的一页表格)

多个用户正在使用"工作项"

每个用户都有一个"工作项"队列

有一个搜索允许用户查看"工作项"并将"工作项"分配给他们的队列

用户可以将"工作项目"从其他人的队列中分配出来,将其分配给自己

注意:'工作项'只能使用一次.这不是一个维基页面,它更像是一个匹配练习,只能由一个用户执行一次.一旦"工作项目"工作,它就会从系统中消失(除了一些审计/报告),有点像错误跟踪系统

您认为哪个选项更好?你能举出任何支持你观点的主流应用吗?

选项1:

当用户A前往查看或工作"工作项目"时,"工作项"将被锁定.

当其他用户在用户A打开"工作项"后转到"工作项"时,他们只能看到"工作项".他们不能写.

锁定在n分钟后到期,此时另一个用户可以锁定"工作项".

选项2:

任何用户都可以在不锁定的情况下拉出"工作项".

如果用户A通过提交表单来处理"工作项"并且用户B工作相同的"工作项",那么用户A的工作将在数据库中生效,并且用户B将被告知他们的更改没有生效,因为另一个用户修改了"工作项".

我个人喜欢选项2.请问?



1> si618..:

听起来你在谈论悲观的诗歌乐观并发控制.

两者都被广泛使用,我个人认为乐观并发更容易处理,但它将取决于您自己的要求和用法.如果编辑(和潜在冲突)很常见,那么悲观并发控制可能是合适的,如果没有,那么乐观并发将更快更简单地使用.

如果您想在SQL Server中查看使用RowVersion数据类型的代码示例(这就是我目前正在使用的内容),请告诉我,但它非常简单:

所有表都包含RowVersion列

所有SELECT查询都包含此列(对于可以修改的数据)

所有UPDATE或DELETE查询都包含WHERE RowVersion = @RowVersion.这是乐观的部分,如果0行返回然后其他人触摸了行,则不会发生更新,因此请告诉用户.注意:如果行已更新,则还应返回RowVersion的新值.这也适用于INSERT查询,就像在插入后返回标识列的Id一样.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有