时释放,所以MySQL中一定不要有大事务,特别是运行时间比较长的事物;
?
不然会导致对metadata lock的长期占用。会阻塞其它事务中任何涉及到该database object的DDL语句和lock table ... write语句;
?
6)DDL 语句和 事务还有lock table xxx write语句的区别:
?
DDL 语句并不会再执行期间一直持有metadata lock,而是只在执行的开始瞬时持有metadata lock,马上释放;
?
而事务会在事务期间一直持有metadata lock;lock table xxx write语句也会一直持有metadata lock直到unlock语句解锁。
?
7)长的事物 和 lock table ... write语句会长时间持有 metadata lock; 所以在执行DDL语句之前,要使用show processlist语句看DDL语句涉及到的table
?
?是否被某个长时间运行的事物所访问。不然DDL语句会存在一直被 metadata lock 所阻塞的危险。可怕的不是DDL,而是长事务。
?
8)mysql命令行工具中执行的 DDL 语句不会受到 autocommit=on/off 的影响,DDL 语句自动开始事务,结束时自动提交事物;
?
9)DDL语句的最大危害之处:
?
未提交事物或者长事务,它们会长时间持有 metadata lock, 会阻塞其后的DDL语句对metada lock的互斥申请,
?
然后该DDL语句对metadata lock的互斥申请,会阻塞其后所有的涉及到该database objects的所有语句,因为它们也要申请metadata lock。