MySQL强制查询锁定表或数据库

时间:2011-10-19 12:08:21

标签: mysql

我的环境是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; ERROR 1317(70100):查询执行中断

  2. 然后我使用XAMPP控制器来停止mysql,然后重新启动它,但这不起作用,因为该表似乎永久锁定。

  3. 我也无法将数据添加到数据库中的其他表中。

    有没有办法可以强制一切只重启/重启,即所有查询和连接?

    提前致谢。

    修改

    我之前解决了这个问题,但忘了更新问题。由于mysql将autocommit设置为false,因此我在每次查询后都没有调用COMMIT;这一事实导致表锁定。在这种情况下,您必须手动提交事务。如果您将autocommit设置为true,那么您无需担心。

1 个答案:

答案 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。