gpt4 book ai didi

php - 通过 php 锁定 mysql 行

转载 作者:可可西里 更新时间:2023-11-01 06:32:20 25 4
gpt4 key购买 nike

我正在帮助一位 friend 使用基于网络的表单,该表单适用于他们的业务。我正在努力让它准备好处理多个用户。我已将其设置为在显示记录以供编辑之前,我使用以下代码锁定记录。

$query = "START TRANSACTION;";
mysql_query($query);
$query = "SELECT field FROM table WHERE ID = \"$value\" FOR UPDATE;";
mysql_query($query);

(好吧,这大大简化了,但这是 mysql 的本质)

它似乎不起作用。但是,当我从命令行直接进入mysql时,用同一个用户登录并执行

START TRANSACTION;
SELECT field FROM table WHERE ID = "40" FOR UPDATE;

我可以有效地阻止网络表单访问记录“40”并得到超时警告。

我试过使用 BEGIN 而不是 START TRANSACTION。我尝试先执行 SET AUTOCOMMIT=0 并在锁定后启动事务,但我似乎无法从 PHP 代码中锁定该行。因为我可以从命令行锁定行,所以我认为数据库的设置方式没有问题。我真的希望我在阅读中遗漏了一些简单的东西。

仅供引用,我正在使用 Apache 2.2.14、MySQL 5.1.41 和 PHP 5.3.1 开发 XAMPP 1.7.3 版。

提前致谢。这是我第一次发帖,但过去我从这个网站上收集了很多知识。

最佳答案

问题不在于代码的语法,而在于您尝试使用它的方式。

just before the record is displayed for editing I am locking the record with the following code

据此,我假设您选择并“锁定”该行,然后向您的用户显示该编辑页面,然后当他们提交更改时,它会保存并“解锁”表格。根本问题就在这里。页面加载完成后,PHP 退出并关闭 MySQL 连接。发生这种情况时,所有的锁都会立即释放。这就是控制台的行为似乎与您的 PHP 不同的原因。控制台中的等效项是您退出程序。

您不能长时间锁定表格行以进行编辑。这不是他们的设计。如果要锁定记录以进行编辑,则需要在另一个表中跟踪这些锁定。新建一张表“edit_locks”,存储被锁定的记录id、编辑的用户id、被锁定的时间。当你想打开一条记录进行编辑时,锁定整个edit_locks表,查询这条记录是否被其他人锁定。如果不是,则插入你的锁记录,如果是,则显示一个锁住的错误。当用户保存或取消时,从edit_locks中移除锁记录。如果你想让事情变得简单,只要在你的程序想要使用它的时候锁定这个表。这将帮助您避免竞争条件。

还有一种情况可能会导致问题。如果用户打开一条记录进行编辑,然后没有保存或取消就关闭了浏览器,编辑锁将永远停留在那里。这就是为什么我说存储它被锁定的时间。编辑器本身应该每 2 分钟左右进行一次 AJAX 调用,以说“我仍然需要锁!”。当 PHP 程序收到这个“重新锁定”请求时,它应该搜索锁,然后将时间戳更新为当前。这样,锁上的时间戳总是在 2 分钟内更新。您还需要创建另一个程序来删除旧的陈旧锁。这应该每隔几分钟在 cron 作业中运行一次。它应该搜索时间戳早于 5 分钟左右的任何锁,然后删除。如果时间戳早于该时间,那么很明显编辑器关闭了一些方式,或者时间戳将在 2 分钟内更新。

就像其他人提到的那样,您应该尝试使用 mysqli .它代表“MySQL Improved”,是旧界面的替代品。

关于php - 通过 php 锁定 mysql 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9814191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com