MySQL 行级锁 表级锁
来源:互联网 发布:avdb新域名 编辑:程序博客网 时间:2024/06/05 17:34
myisam存储引擎默认是表级锁
innodb存储引擎默认是行级锁DBD存储引擎默认是页面锁表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
行级锁:开锁大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
表级锁
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语句用不到索引是不会使用行级锁的,会使用表级锁。行级锁的缺点是:由于需要请求大量的锁资源,所以速度慢,内存消耗大。
阅读全文
0 0
- MySQL表级锁与行级锁
- MySQL行级锁、表级锁、页级锁
- MySQL行级锁、表级锁、页级锁
- MySQL行级锁、表级锁、页级锁
- MySQL 行级锁 表级锁
- MySQL行级锁、表级锁、页级锁
- MySQL表级锁和行级锁
- MySQL表级锁,行级锁和页级锁
- MySQL行级锁,表级锁,页级锁详解
- Mysql行级锁/页级锁/表级锁详解
- MySQL中的行级锁,表级锁,页级锁
- mysql中的行级锁,表级锁,页级锁
- MySQL中的行级锁,表级锁,页级锁
- MySQL中的行级锁,表级锁,页级锁
- MySQL中的行级锁,表级锁,页级锁
- mysql行级锁|表级锁|页级锁详解
- mysql 表级锁
- MYSQL 行级锁
- js高级程序设计(第三版)第五章
- javascript笔记2017/8/21
- sdkman node npm gradle gulp 学习笔记0818 1.3
- react学习笔记
- 洛谷1892 团伙
- MySQL 行级锁 表级锁
- Leetcode 78. Subsets & 90. Subsets II
- win下Eclipse远程连接Hbase的配置及程序示例(create、insert、get、delete)
- 【linux命令】Centos下如何匹配内容在哪个文件中
- 【Noip2011】计算系数
- python简介(1)
- HDOJ1879 继续畅通工程
- JavaScript的执行环境及作用域
- 弹出窗口【DOM】