0

好的,看看这个场景,我得到了一张表,用户可以在其中同时修改许多行。我希望当有人修改记录时,其他人不能修改相同的记录。例如,table1 有 3 列(ID、文本、标志):

ID-文本标志
11-txt1-0
12-txt2-0
13-txt3-0
14-txt4​​-0

我对 Mysql 中的并发控制进行了一些研究,人们建议的第一个解决方案是使用SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE在 Mysql 中。但是,此解决方案有一个限制,即您必须在选择记录后立即更新。例如:

SELECT text FROM table1 where ID<=20 FOR UPDATE;
UPDATE table1 SET text = 'new text' where ID<=20;

但是,我的应用程序要求用户将数据下载到 Gui,然后用户在提交更新之前可能会花费大量时间来处理该数据。

还有第二种方案,Mysql 提供了 Row Lock 机制,但是这种方案需要使用 InnoDB,开销很大。

另一种选择是在mysql中使用表锁,开销很低,但我们不能锁定整个表几个小时,对吧?例如,用户A可能将记录1修改为10,用户B可能同时需要将记录11修改为20,所以用户B不要等到用户A修改完成。

在我看来,我想要一个“标志”列,当用户A正在修改一些记录时,这些记录的标志将变为1,如果用户B想要修改相同的记录,系统会弹出消息说有人是修改它。当用户 A 完成时,它会将标志变为 0,并且用户 A 可以修改这些相同的记录。

但是这个方案有个复杂的问题,如果用户A忘记保存数据怎么办?如果发生这种情况,那么标志永远是 1?那么标志应该在几个小时后过期?& 怎么做?

也许我们需要时间戳或某种机制让标志在一定时间后变回 0?但这比我想象的要复杂。我们不能让数据库每 1 小时检查一次标志的时间戳吗?

--> 我不确定这是否是最优雅的解决方案?我在 DB 设计方面没有商业经验,我想知道 DB 人员如何在商业环境中管理这个问题?

你能找到比上述所有解决方案更好、更优雅的解决方案吗?

4

1 回答 1

0

正如Zerkms 建议的那样,我们根本不需要标志,但我们需要在我们的应用程序中构建“记录比较系统”。

好的,假设任何用户都可以下载数据进行更新,在他修改记录之后和实际更新数据库之前,记录比较系统将检查数据的 ID 和旧文本(不是用户刚刚修改的新数据)与DB中数据的ID和当前文本相同,如果它们相同则他可以提交更新,但如果它们不同则意味着其他人更新了他之前的记录,因此系统将不允许他更新。然后他必须再次下载数据并重新开始。

由于很少有 2 个用户同时更新相同的记录,所以我认为这个解决方案非常可行且易于实施且不会增加开销。当我们在应用程序级别构建记录比较系统时,这称为乐观并发控制,因此不涉及数据库开销。我认为这是满足我的应用程序需求的最优雅的解决方案。

你这么认为吗?

注意:对于这个系统,我们可以使用自增ID(在插入新记录的情况下)

于 2013-05-25T12:21:32.317 回答