本篇内容主要讲解“InnoDB行锁的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“InnoDB行锁的实现方法”吧!
session_1
session_2
mysql>设置自动提交=0;
查询好,0行影响(0.00秒)
mysql>select *从tab_no_index id=1;
+ - - - - - - - - - - - - + +
| id 名字,| |
+ - - - - - - - - - - - - + +
| 1,,| 1,,|
+ - - - - - - - - - - - - + +
1行集(0.00秒)
mysql>设置自动提交=0;
查询好,0行影响(0.00秒)
mysql>select * from tab_no_index id=2;
+ - - - - - - - - - - - - + +
| id 名字,| |
+ - - - - - - - - - - - - + +
| 2,,| 2,,|
+ - - - - - - - - - - - - + +
1行集(0.00秒)
mysql>select * from tab_no_index更新id=1;
+ - - - - - - - - - - - - + +
| id 名字,| |
+ - - - - - - - - - - - - + +
| 1,,| 1,,|
+ - - - - - - - - - - - - + +
1行集(0.00秒)
mysql>select * from tab_no_index id=2的更新;
等待
对齐
在如表20-9所示的例子中,看起来session_1只给一行加了排他锁,但session_2在请求其他行的排他锁时,却出现了锁等待!原因就是在没有索引的情况下,InnoDB只能使用表锁。当我们给其增加一个索引后,InnoDB就只锁定了符合条件的行,如表20所示。
session_1
session_2
mysql>设置自动提交=0;
查询好,0行影响(0.00秒)
mysql>select *从tab_with_index id=1;
+ - - - - - - - - - - - - + +
| id 名字,| |
+ - - - - - - - - - - - - + +
| 1,,| 1,,|
+ - - - - - - - - - - - - + +
1行集(0.00秒)
mysql>设置自动提交=0;
查询好,0行影响(0.00秒)
mysql>select * from tab_with_index id=2;
+ - - - - - - - - - - - - + +
| id 名字,| |
+ - - - - - - - - - - - - + +
| 2,,| 2,,|
+ - - - - - - - - - - - - + +
1行集(0.00秒)
mysql>select * from tab_with_index更新id=1;
+ - - - - - - - - - - - - + +
| id 名字,| |
+ - - - - - - - - - - - - + +
| 1,,| 1,,|
+ - - - - - - - - - - - - + +
1行集(0.00秒)
mysql>select * from tab_with_index id=2的更新;
+ - - - - - - - - - - - - + +
| id 名字,| |
+ - - - - - - - - - - - - + +
| 2,,| 2,,|
+ - - - - - - - - - - - - + +
1行集(0.00秒)
(2)由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。
对齐
在如表20-11所示的例子中,表tab_with_index的id字段有索引,名字字段没有索引:
表20-11 ,,,,,,,,,InnoDB存储引擎使用相同索引键的阻塞例子,,,,
20:12在如表所示的例子中,表tab_with_index的id字段有主键索引,名字字段有普通索引:
表20-12 ,,,,,,,,,,,,,,,,,,,,,InnoDB存储引擎的表使用不同索引的阻塞例子
在下面的例子中,检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换,但却不会使用索引,从而导致InnoDB使用表锁。通过用解释检查两条SQL的执行计划,我们可以清楚地看到了这一点。
& lt; div=岸云雔eft"字体大小:14 px;空白:正常;background - color: # FFFFFF;“比; 例子中tab_with_index表的名字字段有索引,但名字是字段是varchar类型的,如果的条件中不是和varchar类型进行比较,则会对名字进行类型转换,而执行的全表扫描。
- <李>
mysql>alter table tab_no_index添加索引名称(名称),
查询好,4行影响(8.06秒)
记录:4,,重复:0,,警告:0
mysql>解释select * from tab_with_index name=1 \ G
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * *