当人们尝试使用相同的信息更新表时,我在访问MySQL数据库时遇到了一些问题。
我使用PHP编写了一个网页,在其中有一个查询来检查是否已将某些数据输入到数据库中。如果没有,则继续插入。问题在于,如果两个人同时尝试,检查可能会说数据尚未输入,但当插入发生时,它已被其他人输入。
如何处理这种情况?我能锁定数据库只处理我的查询,然后再处理其他人的吗?
当人们尝试使用相同的信息更新表时,我在访问MySQL数据库时遇到了一些问题。
我使用PHP编写了一个网页,在其中有一个查询来检查是否已将某些数据输入到数据库中。如果没有,则继续插入。问题在于,如果两个人同时尝试,检查可能会说数据尚未输入,但当插入发生时,它已被其他人输入。
如何处理这种情况?我能锁定数据库只处理我的查询,然后再处理其他人的吗?
手动锁定表格是你所能做的最糟糕的事情。如果解锁代码从未运行(因为PHP失败,或用户下一步点击了,走开了等),会发生什么。
在Web应用程序中,一个减少这种问题的方法(也是常见的开发人员错误)是将数据网格填满可编辑的文本框,每行或整个表格都有一个保存按钮。显然,如果某人在星期五打开它,并在星期一回来时,数据可能会有误,他们可能会覆盖新数据。一种简单的方式是改为在每行上加入“编辑”按钮,点击该按钮后再加载编辑表单,这样他们希望加载最新数据并且一次只提交1行更改。
但更重要的是,您应该在隐藏输入框中包括日期时间字段,在尝试提交数据时查看日期,并决定数据的年龄以及如何判断其是否过期,并警告或拒绝用户的操作。
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;
mysql_query('LOCK TABLES items');
mysql_query("INSERT INTO items (name, label) VALUES ('foo', 'bar')");
mysql_query('UNLOCK TABLES');
在编辑某些内容之前,您可以检查数据是否已更改。在这种情况下,如果有人在另一个人正在进行编辑时编辑了数据,则会通知他。
有点像stackoverflow处理评论的方式。