我在Debian Squeezy上使用1.2.2 MySQLdb和Python 2.6.6以及MariaDB 5.5.30。 所有表都使用MyIsam引擎。
我的代码是将一些数据写入临时表,然后将其插入永久表中并在此之后截断temp。所以,临时表是某种缓冲区。
有时(经常,但并非总是)它会在截断时冻结。 MySQL命令行客户端显示它正在等待表元数据锁定。没有其他进程可能会锁定表。
MariaDB [torgi]> show processlist;
+-----+------+-----------+-------+---------+------+---------------------------------+------------------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+-----+------+-----------+-------+---------+------+---------------------------------+------------------------------+----------+
| 194 | root | localhost | torgi | Sleep | 29 | | NULL | 0.000 |
| 195 | root | localhost | torgi | Query | 29 | Waiting for table metadata lock | TRUNCATE `notifications_new` | 0.000 |
| 196 | root | localhost | torgi | Query | 0 | NULL | show processlist | 0.000 |
+-----+------+-----------+-------+---------+------+---------------------------------+------------------------------+----------+
3 rows in set (0.00 sec)
我试图打开自动提交,手动提交或刷新表(请参阅注释行)。都没有帮助。
以下是代码:
def upt(table, con) :
#con.autocommit(True)
cur = con.cursor()
cur.execute('REPLACE INTO `'+table+suffix+'` select * from `'+table+tmp_suffix+'`;')
#cur.execute('FLUSH tables;')
#con.commit()
cur.execute('TRUNCATE `'+table+tmp_suffix+'`;') # Freeze here!
那么,为什么它会被锁定以及如何修复它?