通过PHP编辑MySQL行时防止同时覆盖

时间:2011-05-11 19:39:59

标签: php mysql

我不确定如何简明扼要地提问,所以我将通过情境语境来解释。

用户A决定他想通过HTML表单修改MySQL行。 同时,User-B决定他也想以同样的方式修改相同的MySQL行。

我们会说MySQL-row是一个包含文本'Can\'t touch this'

的文本字段

这两个用户并不了解每个人的意图。

User-A对MySQL行进行了重大更改并将其保存到数据库中。 MySQL行变为'Can\'t touch this was a popular track by the Hip-Hop artist M.C. Hammer.'

User-B对MySQL行进行微小更改并将其保存到数据库中。 MySQL行变为'Cannot touch this. Please avoid contractions.'

由于User-B决定在User-A完成修改之前修改MySQL行,因此修改用户A会被User-B的修改覆盖。

允许同时编辑数据库行的脚本(如MediaWiki或任何其他wiki软件)如何处理此问题?

4 个答案:

答案 0 :(得分:5)

最简单的解决方案是在任何可以以这种方式编辑的表中添加至少一个额外字段。表示该行被锁定的东西。为了增加实用性,您应该记录行何时被锁定以及由谁锁定。

还需要一个解锁被放弃的记录的定时作业,否则有人可以按顺序编辑每个记录,放弃编辑,并锁定整个数据库。

类似的事情发生在SO上。如果您正在编辑某人的问题而其他人在您工作时保存了一个编辑内容,则会发出问题已被更改并且您的修改不再有效的通知。

答案 1 :(得分:4)

您可以使用行级锁定强制进行一系列编辑(而不是同时进行)。这通常是你想要设计一种合并变化的方法,它会为你节省一些麻烦。

如果您在将提交更改发送到数据库/处理脚本的表单中使用timestamp和sanity变量,这也会有所帮助。然后你可以在写入之前对数据库进行检查,如果没有;给用户一个消息,说明他/她自己之前有帖子或更改..并且让他们在提交他们自己之前看到它。

答案 2 :(得分:3)

我所知道的最简单的方法之一是向表中添加一个版本字段。当您读取记录时,您将获取版本字段并将其作为隐藏字段添加到编辑表单中。在编辑后回发数据时,您将获取记录并检查数据库中的版本字段是否仍与您的表单相匹配。如果没有,那么同时由其他人编辑记录(你如何处理这取决于你)。如果匹配,则更改数据并增加版本号。或者换句话说,乐观锁定的基本实现......

答案 3 :(得分:1)

我喜欢Wesley Murch方法。 此外,您可以允许多个用户更改同一文档,并在第二次提交完成时使用合并。在编辑之前,您需要保留原始文档。