最近在mysql主从复制中用到锁,翻了资料回忆一下。一下内容参考于:http://blog.csdn.net/arkblue/article/details/27376991

1.FLUSH TABLES WITH READ LOCK

这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。

解锁的语句也是unlock tables。

2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}

这个命令是表级别的锁定,可以定制锁定某一个表。例如: lock  tables test read; 不影响其他表的写操作。

解锁语句也是unlock tables。

刷新表

flush tables with read lock,也就是将所有的脏页都要刷新到磁盘,然后对所有的表加上了读锁,于是这时候直接拷贝数据文件也就是安全的。但是如果你发出命令flush tables with read lock时,还有其他的操作,而起是很耗时的操作呢?先说写操作,这个FTWRL肯定是得等的,等写操作完成才能执行FTWRL,这个很好理解。那么对于 其他的读操作呢?比如说在FLWRL发出之前有一个query:select count(*) from tb,那么FTWRL也得等待(show processlist可以看到 waiting for table flush)。你可能会说在mysql中读与读不是不会排斥的吗,为什么需要等待呢?因为FTWRL是要flush脏页的,只有这样才真的能保证数据一致 性(比如说在xtrabackup备份myisam表的时候),而在select count(*) from tb执行的时候,因为所有的操作都是在内存中操作,所以此时还不能完全flush,因此FTWRL就得等待。或许你还会有疑问,select的页不是脏 页,为什么FTWRL还要等待呢?难道mysql不能做得更完善点吗?我觉得mysql还不是不会做的这么简单吧,等待的原因是因为这个表很大,无法一次 性将所有的页都读到内存中来,而query具有原子性,总不可能执行一般被堵塞吧,所以说还是得乖乖的让它执行然,所以FTWRL就得等待了

这两个语句在执行的时候都需要注意个特点,就是 隐式提交的语句。在退出MySQL终端的时候都会隐式的执行unlock tables。也就是如果要让表锁定生效就必须一直保持对话。

这点要注意

最新文章

  1. 机器学习实战(一)kNN
  2. jsexcel导出插件
  3. Servlet/JSP-05 Cookie
  4. JS写的多级联select,如何取值
  5. AngularJS初始化闪烁
  6. 关于解决JQUERY对INPUT元素Change事件不兼容的问题
  7. Python 基础语法(四)
  8. 【shell】多命令执行顺序
  9. 10 程序员必备:Linux日常维护命令
  10. SSO单点登录的实现原理
  11. 最大乘积(Maximum Product,UVA 11059)
  12. 动态生成Zip
  13. python 正则指北之我的总结
  14. java 面向对象String类
  15. windows 2008 r2 安装TabsStudio
  16. v-for & duplicate key bug
  17. python 用cookie模拟登陆网站
  18. lodash toString 转换为字符串
  19. 【学时总结】◆学时·VI◆ SPLAY伸展树
  20. 团队项目-任务分解[Alpha0]

热门文章

  1. Webstrom (或Phpstrom)使用git(oschina-码云)
  2. 基于HTML5技术的电力3D监控应用(四)
  3. CentOS6.5菜鸟之旅:VirtualBox4.3识别USB设备
  4. Qt之QAbstractItemView右键菜单
  5. 订餐APP第一次sprint+燃尽图
  6. thread_AtomicBoolean
  7. Winform开发框架之权限管理系统的改进
  8. jQuery回调函数
  9. 【循序渐进学Python】7.面向对象的核心——类型(上)
  10. sql: table,view,function, procedure created MS_Description in sql server