假设我们有一个表单,其中有多个文本框和一个按钮,当我们单击它时,它会将数据保存到数据库记录中。
让我们说用户1打开表单,大约在同一时间,用户2打开相同的表单。用户1更改电子邮件文本框中的值并保存表单,而用户2仍然具有 - 现在是 - 旧电子邮件的表单。用户2更改电话号码文本框中的值并保存。
由于提交按钮的功能是由一个大的更新语句驱动的,该更新语句将表单中的所有字段更新到数据库中的记录,当用户1返回记录时,根据他们的经验,电子邮件不是保存到数据库,因为用户2的提交已经更新了记录中的所有字段,当时用户2的表格中包含了任何内容。
在我工作的公司,用户报告了当多个用户更新相同记录中的字段时,他们保存的数据神奇地消失的情况,我开始怀疑这是原因。
在处理这个问题方面,有人能指出我正确的方向吗?我很难找到讨论这些问题的任何文章/资源。
由于
答案 0 :(得分:4)
解决问题的常用方法称为乐观并发。基本思想是每个表都包含一个额外的列,它是时间戳或版本号。从数据库中读取时,将跟踪版本号,并在更新数据库时检查数据库中的版本号是否与读取该行时的版本号相同。如果不是,则意味着其他人在此期间更改了行,您现在应该中止更新并通知用户(如果可能,优雅地呈现已更改的数据库数据和用户的数据)。
重要的是“只读取当前行版本并仅在未更改时更新行”操作是同一事务的一部分;否则,你会遇到竞争条件。某些数据库服务器包含处理此问题的内置方法,例如SQL Server的SNAPSHOT
隔离级别。
答案 1 :(得分:1)
您可以通过每个用户都有表单的方式进行制作。当用户点击“保存”时。数据一次全部发送。 要处理来自冲突的数据覆盖问题,您可以使表单必须告诉后端准备就绪,同时使其对其他用户不可用。在发送数据之前,后端将为新数据做好准备。
例如,当user1将表单数据发送到后端时,后端将忽略来自user2的所有就绪消息,直到发送数据并且user2尝试再次发送就绪消息。如果后端同时收到2条或更多就绪消息,它将选择随机向一个用户回复ok消息并开始与该用户进行数据传输。