免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1496 | 回复: 0
打印 上一主题 下一主题

InnoDb 表锁 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-05 11:07 |只看该作者 |倒序浏览
InnoDb 表锁
2008年10月19日 星期日  14:50
(2)由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。
例如,表tab_with_index的id字段有索引,name字段没有索引:
mysql> alter table tab_with_index drop index name;

Query OK, 4 rows affected (0.22 sec)

Records: 4  Duplicates: 0  Warnings: 0


mysql> insert into tab_with_index  values(1,'4');

Query OK, 1 row affected (0.00 sec)


mysql> select * from tab_with_index where id = 1;

+------+------+

| id    | name |

+------+------+

| 1     | 1     |

| 1     | 4     |

+------+------+

2 rows in set (0.00 sec)

                                     InnoDB存储引擎使用相同索引键的阻塞例子         
   
        
            
            session_1
            
            
            session_2
            
        
        
            
            mysql> set autocommit=0;
            

            Query OK, 0 rows affected (0.00 sec)
            

            
            

            
            

            
            
            mysql> set autocommit=0;
            

            Query OK, 0 rows affected (0.00 sec)
            

            
            

            
            

            
        
        
            
            mysql> select * from tab_with_index where id = 1 and name = '1' for update;
            

            +------+------+
            

            | id    | name |
            

            +------+------+
            

            | 1     | 1     |
            

            +------+------+
            

            1 row in set (0.00 sec)
            

            
            

            
            

            
            

            
            

            
            

            
            

            
            

            
            
            
            

            
            

            
        
        
            
            
            

            
            

            
            
            虽然session_2访问的是和session_1不同的记录,但是因为使用了相同的索引,所以需要等待锁:
            

            mysql> select * from tab_with_index where id = 1 and name = '4' for update;
            

            等待
            

            
            

            
            

            
            

            
        
   

(3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。
例如,表tab_with_index的id字段有主键索引,name字段有普通索引:
mysql> alter table tab_with_index add index name(name);

Query OK, 5 rows affected (0.23 sec)

Records: 5  Duplicates: 0  Warnings: 0
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69385/showart_1852281.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP