Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL信息\u架构表未填充_Mysql_Innodb - Fatal编程技术网

MySQL信息\u架构表未填充

MySQL信息\u架构表未填充,mysql,innodb,Mysql,Innodb,我创建一个虚拟表: CREATE TABLE `lock_test` ( `name` varchar(32) NOT NULL, PRIMARY KEY (`name`) ) ENGINE=InnoDB ; 我锁上它: LOCK TABLE lock_test write; 然后我尝试再次锁定它(相同的查询)。第二个锁请求显然挂在那里 select * from INFORMATION_SCHEMA.INNODB_LOCKS; select * from INFORMATION_S

我创建一个虚拟表:

CREATE TABLE `lock_test` (
  `name` varchar(32) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB ;
我锁上它:

LOCK TABLE lock_test write;
然后我尝试再次锁定它(相同的查询)。第二个锁请求显然挂在那里

select * from INFORMATION_SCHEMA.INNODB_LOCKS;
select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
都是空的(返回零结果)-我希望它们会被填充。我有
PROCESS
权限(显示
PROCESSLIST
显示锁正在工作)

关于这些桌子,我的立场是否完全错误?信息模式插件和InnoDB引擎已明确安装(通过运行SHOW plugins;)进行检查)


谢谢

您是否有
自动提交=1
?如果是,那就是原因。有两种类型的锁,在不同的层上使用,一种在MySQL层,另一种在存储引擎(InnoDB)层

从MySQL文档中:

当您调用
锁表时
,InnoDB在内部拥有自己的表锁,MySQL拥有自己的表锁。InnoDB在下一次提交时释放其内部表锁,但是为了让MySQL释放其表锁,您必须调用
UNLOCK TABLES
。您不应该有
autocommit=1
,因为然后InnoDB在调用
lock TABLES
后立即释放其内部表锁,死锁很容易发生。如果
autocommit=1
,InnoDB根本不会获取内部表锁,以帮助旧应用程序避免不必要的死锁

同时检查文件的这一部分(最后两段):

LOCK TABLES
设置表锁,但设置这些锁的是InnoDB层之上的较高MySQL层如果InnoDB_table_locks=1(默认值)和
autocommit=0
,InnoDB就会知道表锁,InnoDB上面的MySQL层知道行级锁


有趣的是,“问题”是我试图两次直接锁定表,这似乎并没有填充该表。我将其更改为两个相互干扰的事务,并按预期工作。

您是否有
autocommit=1
?您好-是的,它们肯定已提交(我必须打开第二个连接以发出第二个锁命令-如果未提交,第二个锁将失败)。谢谢它应该显示在这里:
显示打开的表,其中In_use=1谢谢你的回答。我只是将autocommit设置为0,然后重新运行我的测试用例,但没有成功。桌子还是空的。