2009-01-14 71 views
5

我有几个问题,当人们试图访问MySQL数据库,他们试图用相同的信息更新表。锁定MySQL数据库,以便一次只有一个人可以运行查询?

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

处理这种情况的最佳方法是什么?我可以锁定数据库,只处理我的查询,然后呢?

回答

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'); 
0

,如果你做一些修改之前的数据已经改变你可以检查。在这种情况下,如果有人编辑数据而其他人正在进行编辑,则会通知他。

有点像stackoverflow处理评论。

5

请阅读database transactions。这可能是一个比运行LOCK TABLES更好的方式来处理你所需要的。

3

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

在web应用程序中最小化这种情况的一种方法是开发人员常犯的错误,那就是让数据网格充满文本框的数据来编辑,并在每行或整个表上保存按钮。很显然,如果这个人在星期五开放并且在星期一回来,那么这些数据可能是错误的,他们可能会保存新数据。解决这个问题的一个简单方法是在每一行上都有编辑按钮,然后单击该按钮,然后加载一个编辑表单,这样他们可以加载新数据,并且一次只能提交一行更改。

但更重要的是,您应该包含一个日期时间字段作为隐藏的输入框,并且当他们尝试提交数据查看日期并决定数据的年龄并做出决定时,警告或否认用户的行为。

相关问题