表级锁

MySQL表级锁分为读锁和写锁。

读锁

用法:LOCK TABLE table_name [ AS alias_name ] READ

释放锁使用UNLOCK tables.可以为表使用别名,如果一旦使用别名在使用的时候也必须采用别名。成功申请读锁的前提是当前没有线程对该表使用写锁,否则该语句会被阻塞。申请读锁成功后,其他线程也可以对该表进行读操作,但不允许有线程对其进行写操作,就算是当前线程也不允许。当锁住了A表之后,就只能对A表进行读操作,对其他表进行读操作会出现错误(tablename was not locked with LOCK TABLES)

写锁

用法: LOCK TABLE table_name [AS alias_name] [ LOW_PRIORITY ] WRITE

同样也可以使用别名,与读锁不同的是,写锁中可以指定锁的优先级。LOW_PRIORITY是一种比读锁更低优先级的锁,当多个线程同时申请多种锁(LOW_PRIORITY,READ,WRITE)时,LOW_PRIORITY的优先级最低。读锁申请成功的前提是没有线程对表加读锁和其他写锁,否则会被阻塞。

表级锁在MyISAM和innoDB中都有用到,创建锁的开销小,不会出现死锁,由于锁定的是整张表,所以并发度低。当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,推荐使用表级锁。

行级锁

行级锁是Mysql中锁定粒度最细的一种锁,能大大减少数据库操作的冲突,由于其粒度小,加锁的开销最大。行级锁分为共享锁和排他锁。

共享锁(S LOCK)

用法:SELECT ...LOCK IN SHARE MODE;
Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。

排他锁(X LOCK)

用法:SELECT ...LOCK FOR UPDATE;
Mysql会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。
行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁。行级锁的缺点是:由于需要请求大量的锁资源,所以速度慢,内存消耗大。

最新文章

  1. 公司培训 oracle( 第一天)
  2. 利用结果集元数据将查询结果封装为map
  3. Microsoft Azure Web Sites应用与实践【2】—— 通过本地IIS 远程管理Microsoft Azure Web Site
  4. java中的集合和数组
  5. linux下git安装
  6. error setting certificate verify locations: CAfile: E:/git/Git/mingw64/ssl/certs/ca-bundle.crt
  7. python多态
  8. JAVA深复制(深克隆)与浅复制(浅克隆)
  9. WebService一、数据交互
  10. linux上安装配置samba服务器
  11. HBase写数据
  12. bzoj 3505 [Cqoi2014]数三角形 组合
  13. WPF 禁用TextBox的触摸后自动弹出虚拟键盘
  14. python带参函数(计算器脚本解释标注)
  15. SAP MM 预留单据里的Base date和Requirement date
  16. JavaScript 概述
  17. 页面缓存之Meta http-equiv属性详解
  18. SSH学习之四 OpenSSH安全
  19. Linux之virtualbox中的ubuntu虚拟机linux系统共享文件夹
  20. Angular进阶教程三

热门文章

  1. JVM参数配置&&命令工具
  2. 利用Spring Boot+zxing,生成二维码还能这么简单
  3. ScrollView中页面显示自动滑到最后问题的解决
  4. C++中的I/O输入输出问题
  5. EDU 50 E. Covered Points 利用克莱姆法则计算线段交点
  6. CF1097D Makoto and a Blackboard 质因数分解 DP
  7. cogs 1199选课(树形dp 背包或多叉转二叉
  8. 解决问题:SpringMvc中转发的html文件中文是乱码
  9. 【Offer】[18-2] 【删除链表中重复的节点】
  10. 04 python之函数详解