【问题标题】:Locking a MySQL database so only one person at once can run a query?锁定 MySQL 数据库以便一次只有一个人可以运行查询?
【发布时间】:2010-10-01 10:19:04
【问题描述】:

当人们尝试访问 MySQL 数据库并尝试使用相同信息更新表时,我遇到了一些问题。

我有一个使用 PHP 编写的网页。在此网页中是一个查询,用于检查某些数据是否已输入数据库。如果数据没有,那么我继续插入它。麻烦的是,如果两个人同时尝试,检查可能会说数据尚未输入,但插入时却是另一个人。

处理这种情况的最佳方法是什么?我可以锁定数据库以仅先处理我的查询然后处理其他查询吗?

【问题讨论】:

    标签: php mysql concurrency


    【解决方案1】:

    手动锁定表是您做过的最糟糕的事情。如果解锁它们的代码从未运行会发生什么(因为 PHP 失败,或者用户下一步单击下一步,离开 PC 等)。

    在 Web 应用程序中最小化此问题的一种方法(也是开发人员常犯的一个错误)是拥有一个数据网格,其中包含要编辑的数据文本框,每行或整个表格都有一个保存按钮。显然,如果这个人在周五打开这个并在周一回来,数据可能是错误的,他们可能正在保存新数据。解决此问题的一种简单方法是在每一行上都有 EDIT 按钮,然后单击该按钮然后加载一个编辑表单,这样他们就有望加载新数据并且一次只能提交 1 行更改。

    但更重要的是,您应该包含一个日期时间字段作为隐藏的输入框,当他们尝试提交数据时,请查看日期并确定数据的年龄,并确定太旧的时间以及警告或拒绝用户他们的行为。

    【讨论】:

      【解决方案2】:

      您正在寻找LOCK

      http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

      这可以作为简单的mysql_query(或MySQLi::query/prepare)运行。

      我会说最好锁定需要锁定的特定表(尽管您可以尝试LOCK TABLES *)而不是整个数据库 - 因为将无法读取任何内容。我认为您正在寻找类似的东西:

      LOCK TABLES items;
      START TRANSACTION;
      INSERT INTO items (name, label) VALUES ('foo', 'bar');
      UNLOCK TABLES;
      

      或者在 PHP 中:

      mysql_query('LOCK TABLES items');
      mysql_query("INSERT INTO items (name, label) VALUES ('foo', 'bar')");
      mysql_query('UNLOCK TABLES');
      

      【讨论】:

        【解决方案3】:

        阅读database transactions。与运行 LOCK TABLES 相比,这可能是处理所需内容的更好方法。

        【讨论】:

          【解决方案4】:

          您可以在编辑某些内容之前检查数据是否已更改。在这种情况下,如果有人在其他人进行编辑时编辑了数据,则会通知他。

          有点像 stackoverflow 处理评论。

          【讨论】:

            猜你喜欢
            • 2014-10-29
            • 2021-09-05
            • 1970-01-01
            • 1970-01-01
            • 2012-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-24
            相关资源
            最近更新 更多