3.MySQL中的锁

时间:2019-06-17
本文章向大家介绍3.MySQL中的锁,主要包括3.MySQL中的锁使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

  mysql中的锁分全局锁、表锁、行锁。

  1.全局锁

  当执行命令 flush tables with read lock (FTWRL) 即可对整库加锁,全局锁的用途是做整库备份。

  当数据库所用引擎支持事务时可用一致性视图来解决这个问题。即用可重复读隔离级别,当导数据之前开启一个事物即可做到数据的一致性。MySQL自带的逻辑备份命令是mysqldump, 当使

用 mysqldump --single-transaction 时即在导入数据前开启一个事物,来确保拿到一致性视图。

  注:(1)  set global readonly = true也可以锁住整库,但是风险很大,当客户端断开连接时锁不会释放。

    (2)  single-transaction 方法只适用于所有的表使用事务引擎的库。

  2.表级锁

  (1)表锁

    语法:lock tables 表名 read/write 即对表加读锁或写锁,用unlock tables 表名即可主动释放锁。

  (2)元数据锁(MDL)

    元数据锁不需要显示加上,在访问一个表时会被自动加上。对一个表做增删改查时加MDL读锁,对一个表的结构做更改时加MDL写锁,读锁之间不互斥,读锁和写锁、写锁和写锁之间互斥。

    

    如何安全的给一个小表加一个字段?

    分析:首先要解决长事务,因为长事务会占用MDL锁(可在information_schema中的innodb_trx表中查看),若有长事务可考虑暂停DDL,或者kill这个长事务。

       如果是个热点表(有频繁请求的表),则可用NOWAIT / WAIT N语法:alter table 表名 NOWAIT add column ; alter table 表名 WAIT N add column;

  3.行锁

    待续。。。

    

原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/11041978.html