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

时间:2009-01-14 17:27:53

标签: php mysql concurrency

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

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

处理此方案的最佳方法是什么?我可以锁定数据库以仅处理我的查询然后再处理其他人吗?

4 个答案:

答案 0 :(得分:5)

阅读database transactions。这可能是比运行LOCK TABLES更好的方法来处理你需要的东西。

答案 1 :(得分:3)

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

在Web应用程序中最小化此问题的一种方法,以及开发人员常见的错误,是让数据网格中包含要编辑的数据文本框,每行或整个表格都有一个保存按钮。显然,如果这个人在星期五打开并在周一回来,那么数据可能是错误的,他们可能会保存新数据。修复此问题的一种简单方法是在每行上都有EDIT按钮,然后单击按钮然后加载编辑表单,这样他们就可以加载新数据,并且一次只能提交1行更改。

但更重要的是,您应该将日期时间字段作为隐藏输入框包含在内,当他们尝试提交数据时,请查看日期并确定数据的年龄并确定数据的年龄是否过大以及警告或否认用户的行为。

答案 2 :(得分:1)

您正在寻找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 :(得分:0)

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

有点像stackoverflow处理评论。