加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

InnoDB行锁的实现方法

发布时间:2022-01-20 14:00:50 所属栏目:MySql教程 来源:互联网
导读:本篇内容主要讲解InnoDB行锁的实现方法,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习InnoDB行锁的实现方法吧! mysql set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql select * from tab_no_i
       本篇内容主要讲解“InnoDB行锁的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“InnoDB行锁的实现方法”吧!
  
mysql> set autocommit=0;
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from tab_no_index where id = 1 ;
 
+------+------+
 
| id   | name |
 
+------+------+
 
| 1    | 1    |
 
+------+------+
 
1 row in set (0.00 sec)
 
 
mysql> set autocommit=0;
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from tab_no_index where id = 2 ;
 
+------+------+
 
| id   | name |
 
+------+------+
 
| 2    | 2    |
 
+------+------+
 
1 row in set (0.00 sec)
 
 
mysql> select * from tab_no_index where id = 1 for update;
 
+------+------+
 
| id   | name |
 
+------+------+
 
| 1    | 1    |
 
+------+------+
 
1 row in set (0.00 sec)
  
mysql> select * from tab_no_index where id = 2 for update;
 InnoDB行锁的实现方法
等待
  
在如表20-9所示的例子中,看起来session_1只给一行加了排他锁,但session_2在请求其他行的排他锁时,却出现了锁等待!原因就是在没有索引的情况下,InnoDB只能使用表锁。当我们给其增加一个索引后,InnoDB就只锁定了符合条件的行,如表20-10所示。
 
session_1
 
 
session_2
 
 
mysql> set autocommit=0;
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from tab_with_index where id = 1 ;
 
+------+------+
 
| id   | name |
 
+------+------+
 
| 1    | 1    |
 
+------+------+
 
1 row in set (0.00 sec)
 
 
mysql> set autocommit=0;
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> select * from tab_with_index where id = 2 ;
 
+------+------+
 
| id   | name |
 
+------+------+
 
| 2    | 2    |
 
+------+------+
 
1 row in set (0.00 sec)
 
 
mysql> select * from tab_with_index where id = 1 for update;
 
+------+------+
 
| id   | name |
 
+------+------+
 
| 1    | 1    |
 
+------+------+
 
1 row in set (0.00 sec)
 
 
 
 
mysql> select * from tab_with_index where id = 2 for update;
 
+------+------+
 
| id   | name |
 
+------+------+
 
| 2    | 2    |
 
+------+------+
 
1 row in set (0.00 sec)
 
 
 
(2)由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。
 
 
在如表20-11所示的例子中,表tab_with_index的id字段有索引,name字段没有索引:
 
表20-11                InnoDB存储引擎使用相同索引键的阻塞例子      
 
在如表20-12所示的例子中,表tab_with_index的id字段有主键索引,name字段有普通索引:
 
表20-12                                  InnoDB存储引擎的表使用不同索引的阻塞例子
 
在下面的例子中,检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换,但却不会使用索引,从而导致InnoDB使用表锁。通过用explain检查两条SQL的执行计划,我们可以清楚地看到了这一点。
 
<div align="left" font-size:14px;white-space:normal;background-color:#FFFFFF;"> 例子中tab_with_index表的name字段有索引,但是name字段是varchar类型的,如果where条件中不是和varchar类型进行比较,则会对name进行类型转换,而执行的全表扫描。
 
mysql> alter table tab_no_index add index name(name);
Query OK, 4 rows affected (8.06 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> explain select * from tab_with_index where name = 1 G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tab_with_index
         type: ALL
possible_keys: name
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
        Extra: Using where
1 row in set (0.00 sec)
mysql> explain select * from tab_with_index where name = '1' G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tab_with_index
         type: ref
possible_keys: name
          key: name
      key_len: 23
          ref: const
         rows: 1
        Extra: Using where
1 row in set (0.00 sec)
到此,相信大家对“InnoDB行锁的实现方法”有了更深的了解,不妨来实际操作一番吧!

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读