如何锁定MySQL数据库,以便一次只有一个人可以运行查询?

5

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

我使用PHP编写了一个网页,在其中有一个查询来检查是否已将某些数据输入到数据库中。如果没有,则继续插入。问题在于,如果两个人同时尝试,检查可能会说数据尚未输入,但当插入发生时,它已被其他人输入。

如何处理这种情况?我能锁定数据库只处理我的查询,然后再处理其他人的吗?

4个回答

5

阅读有关数据库事务的内容。这可能比运行LOCK TABLES更好地处理您所需的事情。


4

手动锁定表格是你所能做的最糟糕的事情。如果解锁代码从未运行(因为PHP失败,或用户下一步点击了,走开了等),会发生什么。

在Web应用程序中,一个减少这种问题的方法(也是常见的开发人员错误)是将数据网格填满可编辑的文本框,每行或整个表格都有一个保存按钮。显然,如果某人在星期五打开它,并在星期一回来时,数据可能会有误,他们可能会覆盖新数据。一种简单的方式是改为在每行上加入“编辑”按钮,点击该按钮后再加载编辑表单,这样他们希望加载最新数据并且一次只提交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');

0

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

有点像stackoverflow处理评论的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接