如何处理 Web 应用程序中的并发更改?

2023-11-22

以下是我想在 Web 应用程序中执行的两个潜在工作流程。

变化1

  • 用户发送请求
  • 服务器读取数据
  • 服务器修改数据
  • 服务器保存修改后的数据

变化2:

  • 用户发送请求
  • 服务器读取数据
  • 服务器向用户发送数据
  • 用户发送带有修改的请求
  • 服务器保存修改后的数据

在每种情况下,我想知道:确保对该服务的并发访问将产生合理结果的标准方法是什么? (即没有人的编辑被破坏,值对应于编辑的某些顺序等)

这种情况是假设的,但以下是我在实践中可能需要处理此问题的一些细节:

  • Web 应用程序,但未指定语言
  • 可能,使用网络框架
  • 数据存储是 SQL 关系数据库
  • 涉及的逻辑太复杂,无法在查询中很好地表达,例如值 = 值 + 1

我觉得我不想在这里尝试重新发明轮子。当然,这些都是众所周知的问题,也有众所周知的解决方案。请指教。

Thanks.


据我所知,这个问题没有通用的解决方案。

问题的根源在于,用户可能会检索数据并在屏幕上盯着它很长时间,然后再进行更新和保存。

我知道三种基本方法:

  1. 当用户读取数据库时,锁定记录,直到用户保存任何更新后才释放。实际上,这是非常不切实际的。如果用户打开一个屏幕然后去吃午饭而不保存怎么办?还是回家休息一天?或者是因为试图更新这个愚蠢的记录而感到沮丧,以至于他退出并且再也没有回来?

  2. 将您的更新表示为增量而不是目的地。举一个经典的例子,假设您有一个记录库存的系统。每次有销售时,您必须从库存数量中减去 1(或更多)。

假设现有数量为 10。用户 A 创建了一笔销售。当前数量 = 10。用户 B 创建销售。他还得到当前数量 = 10。用户 A 输入已售出两个单位。新数量 = 10 - 2 = 8。保存。用户 B 输入已售出的一件商品。新数量 = 10(他加载的值) - 1 = 9。保存。显然,出了问题。

解决方案:不要编写“更新库存集数量=9,其中 itemid=12345”,而是编写“更新库存集数量=数量-1,其中 itemid=12345”。然后让数据库对更新进行排队。这与策略 #1 有很大不同,因为数据库只需锁定记录足够长的时间即可读取、更新和写入。当有人盯着屏幕时,它不必等待。

当然,这仅适用于可以表示为增量的更改。比如说,如果您要更新客户的电话号码,这是行不通的。 (例如,旧号码是 555-1234。用户 A 说将其更改为 555-1235。这是 +1 的更改。用户 B 说将其更改为 555-1243。这是 +9 的更改。所以总更改是+10,客户的新号码是 555-1244。:-) ) 但在这种情况下,“最后一个单击 Enter 键的用户获胜”可能是您能做的最好的选择。

  1. 更新时,检查数据库中的相关字段是否与您的“来自”值匹配。例如,假设您在一家律师事务所工作,为您的客户谈判合同。您有一个屏幕,用户可以在其中输入有关谈判的注释。用户A调出一条合同记录。用户B调出相同的合同记录。用户 A 输入,他刚刚通过电话与另一方通话,并且他们同意所提议的条款。用户 B 也一直试图给对方打电话,他输入说他们没有回复电话,他怀疑他们在阻挠。用户 A 单击“保存”。我们是否希望用户 B 的评论覆盖用户 A 的评论?可能不会。相反,我们显示一条消息,指示自他读取记录以来注释已更改,并允许他在决定是否继续保存、中止或输入不同内容之前查看新值。

[注意:论坛会自动对我的编号列表重新编号。我不知道如何覆盖这个。]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 Web 应用程序中的并发更改? 的相关文章

  • Django 模型同步表

    如果我更改 Django 模型中的字段 如何将其与数据库表同步 我是否需要在数据库上手动执行此操作 或者是否有工具可以帮助完成此过程 唉 Django 不支持任何简单的解决方案 django 唯一能为你做的就是使用与新模型匹配的新表重新启动
  • 内容安全策略:页面设置阻止自行加载资源?

    我有基于 Java 的 Web 应用程序运行在Tomcat http en wikipedia org wiki Apache Tomcat6 我的应用程序在本地主机和端口 9001 上运行 为了使我的应用程序更加安全并降低风险XSS ht
  • LinkedBlockingQueue 抛出 InterruptedException

    我有这段代码 ALinkedBlockingQueue应该只抛出一个Exception如果在等待添加到队列时被中断 但这个队列是无限的 所以它应该尽快添加 为什么我的关闭方法会抛出一个InterruptedException private
  • 如何使用索引更改表的列?

    我想将带有某些索引的表中 a 列的列大小从 varchar 200 更改为 varchar 8000 我应该如何进行 既然是VARCHAR你正在增加尺寸 然后简单地ALTER TABLE ALTER COLUMN https learn m
  • MVVM 在 ASP.NET MVC 4 Web 应用程序中扮演什么角色?

    当我正在阅读 ASP NET MVC 4 这本书时 我对 MVVM 感到好奇 我开始谷歌搜索 找不到任何关于使用 MVVM 开发 Web 应用程序的书籍 所以我一定在这里遗漏了一些信息 据我了解 MVVM是通过knockout js和其他框
  • 外部化 Spring Security 配置?

    我有一个 Web 应用程序 可以使用 Spring Security 的几种不同配置 但是 这些差异配置都是在我的 applicationContext 配置文件中设置的 因此 为了在客户站点调整这些内容 必须在 WAR 文件内修改这些内容
  • 在 IEnumerable 中查找相同的集合

    有一项任务要弄清楚如何更新表 DataTable 连接到一个database没有UPDATE陈述 我想出的例子是从邮箱中读取警报 该表将写入 Alerts 如果邮件正文包含单词 SUCCESS gt Alert 变为绿色 如果 FAIL g
  • 子查询在多项选择时返回超过 1 个值的 SQL 错误

    我想要一个临时表 它将使用 select 语句插入值 但每次我运行查询时 总是出现错误 子查询返回超过 1 个值 当查询跟随 gt 或子查询用作表达式时 不允许这样做 该语句已终止 0 行受影响 这很奇怪 因为代码中似乎没有错误 但如果有的
  • 当Java中set已经是原子的时候,为什么我们还需要compareAndSet呢?

    因为原子意味着线程安全 当 set 本身在java中是原子和线程安全的时候 我们什么时候使用compareAndSet 举例来说 我想以原子方式设置一个变量 以便每个其他线程都可以看到它 但我希望以线程安全的方式设置该变量 我可以简单地将其
  • CompletableFuture SupplyAsync

    我刚刚开始探索 Java 8 的一些并发特性 让我有点困惑的一件事是这两个静态方法 CompletableFuture
  • 数据库设计 - “推”模型,或写时扇出

    背景信息 我正在尝试检索我关注的人的图像 按最新时间排序 它就像 Twitter 新闻源 显示您朋友的最新动态 Plans 目前我只需要考虑一项 那就是图像 将来我计划分析用户的行为并将他们可能喜欢的其他图像添加到他们的提要中等 http
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • 为什么MongoDB不使用复合索引进行查询?

    以下是我对此集合的复合索引和单一索引 db Collection getIndexes 1 v 2 key id 1 name id ns service Collection 2 v 2 key FirstId 1 SecondId 1
  • 我应该安装哪个驱动程序才能使用 powershell 运行 mysqlcommand?

    我安装了 mysql 连接器 ODBC 5 1 8 来运行 sqlcommand 但出现此错误 Cannot find type MySql Data MySqlClient MySqlConnection make sure the as
  • 如何将UTF-8编码的汉字从MySql正确导出到SQL

    过去三天我们正在与严重的问题作斗争 我们从PhpmyAdmin导出MySql数据库文件 数据库条目中写入的数据是带有UTF 8字符集的中文 导出后将其转换为拉丁字符集 现在我们正在将此数据库SQl文件导入到其他主机 我们在UTF 8和排序规
  • 如何检测数据库类型?

    我需要确保我连接的数据库是 MySQL 而不是 PostgreSQL 或 Microsoft SQL Server 我怎样才能知道正在使用哪种类型的数据库 第一个提示可能是如果您尝试使用 mySQL 数据库驱动程序连接到 PostgreSQ
  • 为什么我会得到以下结果? [复制]

    这个问题在这里已经有答案了 我做了以下测试 看看如何 PriorityBlockingQueue
  • 如何在 Compojure 中使用 lib-noir 有状态会话

    我想我这里有一个相当简单的问题 但我已经看这个屏幕太久了 所以我正在尝试 但失败了 让有状态会话在 Compojure 中工作 refheap代码粘贴is here https www refheap com paste 11161 你可以
  • 托管 bean 有时为 null,有时不为 null

    我有一个托管 bean LoginBean ManagedBean name loginBean SessionScoped public class LoginBean implements Serializable private St
  • Windows 上的虚假唤醒。是否可以?

    我最近学习了 虚假唤醒 有人说这个问题只可能发生在某些类型的 Linux PC 上 我用的是窗户 我为虚假唤醒编写了测试 我得到的结果是这是可能的 但我想向您展示这个测试 也许我在某个地方犯了错误 我的初始变体 import java ut

随机推荐