我有一堆连接在事务中执行SELECT,还有一个连接执行DDL。mysql手册对于事务中metadata锁的获取非常清晰:
为了确保事务的串行化,服务器不能允许一个会话在另一个未完成的显式或隐式启动的事务中使用的表上执行数据定义语言(DDL)语句。服务器通过在事务中使用的表上获取元数据锁并推迟释放这些锁直到事务结束来实现此目的。对表的元数据锁定防止更改表的结构。这种锁定方法意味着在一个会话中使用的表在事务结束之前不能被其他会话用于DDL语句。
这很有道理,所以我进行了以下测试:
在我的系统上,当连接A提交时,连接C执行,而连接B仍然挂起:因为SELECT事务导致其无法执行。我本以为元数据锁等待队列会按照FIFO的顺序进行处理,但似乎并非如此。
关于元数据等待队列处理顺序是否有文件记录?
为了确保事务的串行化,服务器不能允许一个会话在另一个未完成的显式或隐式启动的事务中使用的表上执行数据定义语言(DDL)语句。服务器通过在事务中使用的表上获取元数据锁并推迟释放这些锁直到事务结束来实现此目的。对表的元数据锁定防止更改表的结构。这种锁定方法意味着在一个会话中使用的表在事务结束之前不能被其他会话用于DDL语句。
这很有道理,所以我进行了以下测试:
connectionA$ begin;
connectionA$ select * from facebook_authorizations;
connectionA$ ....
connectionB$ alter table facebook_authorizations add column foo int default null;
connectionC$ begin;
connectionC$ select * from facebook_authorizations;
connectionA$ commit;
在我的系统上,当连接A提交时,连接C执行,而连接B仍然挂起:因为SELECT事务导致其无法执行。我本以为元数据锁等待队列会按照FIFO的顺序进行处理,但似乎并非如此。
关于元数据等待队列处理顺序是否有文件记录?