InnoDB行锁的实现方法

  介绍

本篇内容主要讲解“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。行* * * * * * * * * * * * * * * * * * * * * * * * * * *

InnoDB行锁的实现方法