MySQL全局锁和表锁

MySQL全局锁和表锁

全局锁

  对整个数据库加锁,语句为:Flush tables with read lock (FTWRL),加锁之后不可以进行增删改,也不能做DDL,是一个整库只读的状态,一般只有在做全库逻辑备份时才需要全局锁。可以看到,如果采用这种方式对库加锁的话,虽然保证了一致性,但十分影响业务。所以,应该尽量少采用这种方法,在数据的隔离级别中,可重复读也保证了在一个事务中所看到的数据是一致的,MySQL官方提供的mysqldump工具中就提供了–single-transaction参数实现一致性读,但是注意,这是需要存储引擎支持的~,对于MyISAM引擎还是只能采用上面的全局锁,全局锁的核心思想上是让数据库只读,也可以通过set global readonly=true命令来实现(但是这个命令影响范围更大,且客户端异常时并不会自动释放只读状态)。

表锁

  一共分为两种:表锁和元数据锁(MDL)
  表锁:lock tables +表名 read/write
  元数据锁:无需显式使用,自动加上,分为MDL读锁、MDL写锁,读锁之间可以共享,读锁与写锁互斥,写锁之间也互斥。事务中的MDL锁,在语句执行开始时申请,但是语句结束后并不会马上释放,而会等到整个事务提交后再释放
在对表结构进行修改时,要十分小心,要先查看是否有长事务,先kill掉,否则有可能阻塞住表上的查询。为了避免这一问题,可以在alter t上增加时间限制ALTER TABLE tbl_name NOWAIT add column ...ALTER TABLE tbl_name WAIT N add column ...

参考文献

MySQL实战45讲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章