我如何确保用户不会更新彼此的数据?

本文关键字:更新 数据 用户 何确保 确保 | 更新日期: 2023-09-27 18:08:42

假设我们有一个表单,其中有几个文本框和一个按钮,当我们单击它时,它将数据保存到数据库记录中。

假设用户1打开了表单,大约在同一时间,用户2打开了相同的表单。用户1更改了电子邮件文本框中的值并保存了表单,而用户2仍然保留了包含旧电子邮件的表单。用户2修改电话号码文本框中的值并保存。

由于提交按钮的功能是由一个大的更新语句驱动的,该语句将表单中的所有字段更新到数据库中的记录,当用户1返回到记录时,根据他们的经验,他们的电子邮件没有保存到数据库中,因为用户2的提交更新了记录中的所有字段,使用当时用户2的表单中的内容。

在我工作的公司,用户报告了当多个用户更新同一记录中的字段时,他们保存的数据神奇地消失的情况,我开始怀疑这就是原因。

在处理这个问题方面,有人能给我指一下正确的方向吗?我很难找到任何讨论这些问题的文章/资源。

谢谢

我如何确保用户不会更新彼此的数据?

解决问题的一种常用方法称为乐观并发性。基本思想是每个表包含一个额外的列,该列可以是时间戳或版本号。从数据库读取数据时,要跟踪版本号,更新数据库时,要检查数据库中的版本号是否与读取该行时的版本号相同。如果不是,则意味着有人同时更改了行,您现在应该中止更新并通知用户(如果可能的话,优雅地显示更改的数据库数据和用户的数据)。

重要的是,"读取当前行版本,只有当它没有改变时才更新行"操作是同一个事务的一部分;否则,你就会陷入竞争状态。一些数据库服务器包含内置的方法来处理此问题,例如SQL Server的SNAPSHOT隔离级别。

您可以让每个用户都有一个表单。当用户单击Save时。所有的数据都是一次性发送的。要处理来自冲突的数据覆盖问题,您可以这样做,以便表单必须告诉后端准备好,同时使其对其他用户不可用。在发送数据之前,后端将为新数据做好准备。

例如,当user1向后端发送表单数据时,后端将忽略来自user2的所有就绪消息,直到数据发送并且user2尝试再次发送就绪消息。如果后端同时接收到2个或更多的就绪消息,它将选择随机地向一个用户回复ok消息,并开始与该用户进行数据传输。