我的环境是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)
我尝试了两件事:
KILL QUERY 17
我得到了以下结果:
的MySQL>杀戮17; ERROR 1317(70100):查询执行中断
然后我使用XAMPP控制器来停止mysql,然后重新启动它,但这不起作用,因为该表似乎永久锁定。
我也无法将数据添加到数据库中的其他表中。
有没有办法可以强制一切只重启/重启,即所有查询和连接?
提前致谢。
修改
我之前解决了这个问题,但忘了更新问题。由于mysql将autocommit设置为false,因此我在每次查询后都没有调用COMMIT;
这一事实导致表锁定。在这种情况下,您必须手动提交事务。如果您将autocommit设置为true,那么您无需担心。
答案 0 :(得分:0)
问题在于,当我打开PDO::ATTR_AUTOCOMMIT
数据库连接时,我将false
设置为PDO
,并且我试图在没有显式提交事务的情况下运行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。