好的,看看这个场景,我得到了一张表,用户可以在其中同时修改许多行。我希望当有人修改记录时,其他人不能修改相同的记录。例如,table1 有 3 列(ID、文本、标志):
ID-文本标志 11-txt1-0 12-txt2-0 13-txt3-0 14-txt4-0
我对 Mysql 中的并发控制进行了一些研究,人们建议的第一个解决方案是使用SELECT ... FOR UPDATE
或SELECT ... 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 人员如何在商业环境中管理这个问题?
你能找到比上述所有解决方案更好、更优雅的解决方案吗?