gpt4 book ai didi

MySQL 在锁定的表或数据库上强制终止查询

转载 作者:行者123 更新时间:2023-11-29 03:44:40 25 4
gpt4 key购买 nike

我的环境是 Windows 7,我正在使用 XAMPP。

我正在对 MySQL 进行一些性能测试,模拟一次添加 100 行。我使用带有 for 循环的简单 PHP 查询来执行此操作。

但是,MySQL 似乎已锁定,因为我无法再向表中添加任何内容。

我登录MySQL查看进程列表如下:

mysql> SHOW PROCESSLIST \G;
*************************** 1. row ***************************
Id: 1
User: root
Host: localhost:49349
db: NULL
Command: Sleep
Time: 2
State:
Info: NULL
*************************** 2. row ***************************
Id: 17
User: root
Host: localhost:49759
db: NULL
Command: Query
Time: 0
State: NULL
Info: SHOW PROCESSLIST
2 rows in set (0.00 sec)

我尝试了两件事:

  1. KILL QUERY 17 我得到以下结果:

    mysql> 杀死查询 17;错误 1317 (70100):查询执行被中断

  2. 然后我使用 XAMPP Controller 停止 mysql 然后再次启动它,但这没有用,因为表似乎被永久锁定。

我也无法向数据库中的其他表添加数据。

有没有一种方法可以强制一切都重新启动/重新启动,即所有查询和连接?

提前致谢。

编辑

我之前已经解决了这个问题,但是忘记更新问题了。表锁定是由于我没有在每次查询后调用 COMMIT; 造成的,因为 mysql 将自动提交设置为 false。在这种情况下,您必须手动提交事务。如果您将 autocommit 设置为 true,则无需担心任何事情。

最佳答案

问题是当我打开 PDO 数据库连接时,我将 PDO::ATTR_AUTOCOMMIT 设置为 false,并且我试图运行SQL 查询而不显式提交事务。

所以我是这样做的:

$sql_str = "INSERT INTO my_db_table VALUES('data');";
$pdo_stmt_obj = self::$db_handle->prepare($sql_str);
$pdo_stmt_obj->execute();

取而代之的是:

$sql_str = "INSERT INTO my_db_table VALUES('data'); COMMIT;";
$pdo_stmt_obj = self::$db_handle->prepare($sql_str);
$pdo_stmt_obj->execute();

或者这个:

$sql_str = "INSERT INTO my_db_table VALUES('data');";
$db_handle->beginTransaction();
$pdo_stmt_obj = self::$db_handle->prepare($sql_str);
$pdo_stmt_obj->execute();
$db_handle->commit();

并且因为我将它们放在一个循环中,每次我运行脚本时都会批处理(但不提交)100 个插入(所以当我执行 SELECT 时我没有看到插入的数据),我天真地将其误认为是数据库锁定,这不是#InHindsight。

关于MySQL 在锁定的表或数据库上强制终止查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7821045/

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