Hyd*_*erA 14 forms concurrency web-applications
我们的Web应用程序中有一组由多个工作人员管理的表单.这些表格对所有工作人员都很常见.现在,我们已经实现了锁定机制.但问题是,没有可靠的方法知道用户何时退出系统,因此需要解锁表单.我想知道是否有更好的方法来管理编辑相同数据的并发用户.
Spe*_*nce 13
您可以使用乐观并发,这是.Net数据库的设计方式.实际上,您假设通常没有人会同时编辑行.当它发生时,您可以丢弃所做的更改,或者在有两个用户编辑同一行时尝试创建一些更好的重试逻辑.
如果您在开始编辑时保留行中的内容的副本,然后将更新写为:
Update Table set column = changedvalue
where column1 = column1prev
AND column2 = column2prev...
Run Code Online (Sandbox Code Playgroud)
如果这更新零行,那么您知道在编辑期间行已更改,然后您可以处理它,或者只是抛出错误并告诉用户再次尝试.
你还可以创建一些重试逻辑?重新读取数据库中的行,并检查用户所做的更改以及数据库中所做的更改是否能够安全地组合,然后自动执行此操作.或者,您可以向用户提供选择,以确定他们是否仍希望根据数据库中的值进行更改.
执行与许多版本控制系统中的操作类似的操作.允许任何人编辑数据.当用户提交表单时,将检查数据库是否有更改.如果在提交之前没有更改记录,请照常使用.如果两个更改都相同,则忽略传入(现在是多余的)更改.
如果第二次更改与第一次更改不同,则记录现在处于冲突状态.将向用户显示一个新表单,该表单指示冲突更新更改了哪些字段.它是那么用户的责任,以解决冲突(通过更新了全部的修改),或者允许现有更新站立.
正如Spence所说,你需要的是乐观的并发性.没有考虑数据是否已更改的标准网站使用我称之为"最后写入获胜"的内容.简单地说,无论哪种连接最后保存到数据库,该数据版本都是坚持的.在乐观并发中,您使用"第一次写入获胜"逻辑,这样如果两个连接尝试同时保存同一行,则第一个提交获胜而第二个被拒绝.
这个机制有两个部分:
两种方法:
第一个需要使用SQL Server的rowversion数据类型,每次更改行时都会保证更改.好处是它可以很容易地推出自己的逻辑来确定是否有变化.获取数据时,将拉出rowversion列的值,并在提交时将该值与数据库中当前的值进行比较.如果它们不同,则自上次检索数据后数据已更改,您应拒绝提交,否则继续保存数据.
第二个需要将您提取的列与数据库中现有的提交值进行比较.正如Spence建议的那样,如果您尝试更新并且没有更新任何行,那么显然其中一个标准失败了.当某些值为null时,此逻辑可能会变得棘手.许多对象关系映射器甚至.NET的DataTable和DataAdapter技术都可以帮助您解决这个问题.
如果您不将其留给用户,那么表单会抛出一些消息,说明数据自上次编辑后已经发生了变化,您只需重新检索覆盖其更改的数据.您可以想象,用户并不特别喜欢这种解决方案,尤其是在频繁发生的大容量系统中.
更复杂(也更复杂)的方法是向用户显示已更改的内容,允许他们选择尝试重新提交的项目.在幕后,您将再次检索数据,覆盖用户选择的值条目并尝试再次提交.在高容量系统中,这仍然是有问题的,因为在用户尝试重新提交时,数据可能再次发生变化.
结账概念实际上是用户"锁定"行的悲观并发.正如您所发现的,很难在无状态环境中实现.用户因为在签出某些内容时关闭浏览器或使用"后退"按钮返回已签出并尝试重新发送的设置而臭名昭着.国际海事组织,在基于网络的解决方案中尝试走这条路线比要值得更麻烦.假设您使用乐观并发性编写上次更改给定行的用户名,您可以通知在其之前保存数据的拒绝更改的用户.
| 归档时间: |
|
| 查看次数: |
5262 次 |
| 最近记录: |