我是 MySql 的新手,因此我有一个非常天真的问题。我有一些数据库(例如,关于酒店)。所有用户都可以阅读有关这些酒店的信息。管理员可以更改此信息。我的问题如下:如何在修改期间阻止某些酒店条目?换句话说,如果一些管理员发送了对 hotel1 的修改数据的查询(需要 1-10 秒的时间),所有其他管理员应该等待他们对这家酒店的修改。在修改完成之前,用户应该只能看到旧信息。
百万提前致谢!
我是 MySql 的新手,因此我有一个非常天真的问题。我有一些数据库(例如,关于酒店)。所有用户都可以阅读有关这些酒店的信息。管理员可以更改此信息。我的问题如下:如何在修改期间阻止某些酒店条目?换句话说,如果一些管理员发送了对 hotel1 的修改数据的查询(需要 1-10 秒的时间),所有其他管理员应该等待他们对这家酒店的修改。在修改完成之前,用户应该只能看到旧信息。
百万提前致谢!
如果您正在寻找锁定机制,您有多种选择。例如,您可以创建一个新表,您可以在其中跟踪谁在编辑以及正在编辑什么。这个新表将有一个带有“record_edited”字段的唯一键。
当管理员开始编辑酒店详细信息时,您在该表中插入一行,如果结果显示重复条目,则表明已经有人在修改该记录,并告诉管理员稍等。
如果此查询无误返回,则允许管理员继续。
当管理员完成酒店详细信息的更新后,您就可以从表中删除“锁定记录”,并更新数据库中的酒店详细信息。
锁定机制的示例表:
此方法将允许编辑多个酒店详细信息,而“表锁定”将不允许更改整个表的酒店详细信息,直到管理员完成一次更新。
您可以尝试按照文档中的说明锁定表格:
锁表
您还可以创建一个事务(它也锁定表),这是一种更聪明的方法,特别是如果您通过应用程序执行此操作:
交易
真的只需要几秒钟吗?然后使用 InnoDB
BEGIN
和COMMIT
。在这样的“事务”SELECT ... FOR UPDATE
中,用于锁定您将要锁定的行UPDATE
(并且您需要在实际进行更新之前做一些其他工作)。只要有可能,您就应该使事务运行得尽可能快。任何锁定机制都会阻止其他事情。
构建一个为管理操作提供所有参数并在其中包含事务的存储过程可能是有意义的。这可能会在不到一秒的时间内完成。这样,在操作完成之前是否阻止第二个管理员应该无关紧要。
对于长动作,可能需要一个额外的表格,例如 Balazs 所建议的。将 InnoDB 事务用于长时间运行的“锁”可能真的很糟糕。
请花时间研究一些数据库理论并研究这里给出的一些建议。否则,您可能会产生间歇性错误(例如,仅当 2 位管理员“同时”操作时才会发生)并且难以追踪。
这导致了另一件事……详细记录这些操作看到和做了什么。
另一个提示......(假设管理员需要阅读一些信息,做出决定,然后采取行动。)
SELECT(s)
在锁定区域之外进行操作,让管理员做出决定,然后事务仅包含更新(非常快)。但它也包含来自 的信息,SELECT(s)
以验证没有其他任何更改。并做到这一点,UPDATE
如果事情不是SELECT
他们发现的样子,他们就会失败。偶尔,管理员会收到一条神秘消息(您构建的消息)说“无法执行该操作,重新开始”。管理员应该返回,SELECT(s)
因为他们现在将拥有新值(来自其他管理员的操作)。该提示类似于 InnoDB 事务的作用。某些冲突最好通过强制应用程序重新开始来解决。