|
1
13
您可以使用乐观并发,这是.Net数据库的设计方式。实际上,您假设通常没有人会同时编辑一行。当这种情况发生时,您可以扔掉所做的更改,或者在两个用户编辑同一行时尝试创建更好的重试逻辑。 如果您保留了一份开始编辑时所在行的内容,然后将更新写入:
如果这更新了零行,那么您知道该行在编辑过程中发生了更改,然后您可以处理它,或者简单地抛出一个错误并告诉用户再试一次。
|
|
|
2
5
如果第二次更改与第一次不同,则记录现在发生冲突。用户将看到一个新表单,该表单指示哪些字段已被冲突的更新更改。然后,用户有责任解决冲突(通过更新两组更改),或者允许现有的更新继续。 |
|
|
3
4
正如Spence所建议的,您需要的是乐观并发性。一个不考虑数据是否改变的标准网站使用我所说的“最后一次写入获胜”。简单地说,无论最后保存到数据库的是哪个连接,该版本的数据都是固定的。在乐观并发中,您使用“first write wins”逻辑,这样如果两个连接试图同时保存同一行,那么提交wins的第一个连接和第二个连接将被拒绝。 这个机制有两个部分:
确定是否拒绝提交两种方法:
第二种方法需要将拉取的列与其数据库中现有的提交值进行比较。正如Spence所建议的,如果您尝试更新,但是没有更新任何行,那么很明显其中一个条件失败了。当某些值为null时,此逻辑可能会变得棘手。许多对象关系映射器甚至.NET的DataTable和DataAdapter技术都可以帮助您处理这个问题。 处理拒绝的提交
一种更复杂(也更复杂)的方法是向用户显示已更改的内容,允许他们选择要尝试重新提交的项目,在后台您将再次检索数据,用其条目覆盖用户选择的值,然后再次尝试提交。在大容量系统中,这仍然是一个问题,因为当用户尝试重新提交时,数据可能已经再次更改。 签出概念实际上是用户“锁定”行的悲观并发。正如您所发现的,在无状态环境中很难实现。用户只需在签出某个内容时关闭浏览器,或使用“后退”按钮返回已签出的集并尝试重新提交,这是臭名昭著的。在我看来,在一个基于web的解决方案中尝试走这条路比值得的麻烦多了。假设您写入最后一次更改给定行的用户名,并且具有乐观的并发性,则可以通知拒绝更改的用户之前保存数据的用户。 |
|
|
4
1
|
|
|
5
0
为什么需要查找会话超时?只需同步访问您的数据(表单或其他什么),就可以了。
|
|
|
6
0
我们引入了一个非常简单的乐观锁定方案,其工作原理如下:
|
|
|
7
0
您可以在表中使用“timestamp”列。参考: What is the mysterious 'timestamp' datatype in Sybase?
如果是这样,当用户打开一个屏幕时,你必须得到最后一个“ 时间戳 “列到客户端。 在更新之前更改数据之后,您应该检查“timestamp”列(yours和db),以确定是否有人在编辑时更改了数据。 如果它改变了,你会提醒一个错误,他必须重新开始。如果不是,则更新数据。时间戳列自动更新。 |
|
|
8
0
最简单的方法是格式化update语句,以包含记录上次更新的日期时间。例如:
这样,只有在上次读取后没有其他人更改记录时,更新才会成功。
|
|
|
A. Shawkat · 获取请求不起作用 8 年前 |
|
|
Yura · 无法链接引导。min.css和动态web app 8 年前 |
|
|
jasonharper · 无互联网连接的WiFi连接设备的最佳实践 8 年前 |
|
|
Thanh Dong · 在spring boot web应用程序中运行jar文件时,创建名为“ConfigurationPropertiesBindingPostProcessor”的bean时出错 8 年前 |
|
|
Karim Sawma · react web app中缺少滚动条 8 年前 |
|
|
Nathan · Flask API回调侦听器 8 年前 |
|
|
David Artmann · Vaadin网格日期渲染器不适用 8 年前 |
|
|
Hayden · 如何防止计数器的增量超过元素的高度? 8 年前 |