+ -
当前位置:首页 → 问答吧 → 关于MySQL Innodb锁的几个问题

关于MySQL Innodb锁的几个问题

时间:2011-08-01

来源:互联网

最近开始研究MySQL,对于Mysql innodb锁的实现,有一些地方不太明白,请教各位:

1. MySQL默认的隔离级别是repeatable read,但这个隔离级别会导致更严重一些的锁问题,我觉得一般用read committed就足够了。
   大家在生产环境中一般用的是那种隔离级别?

2. 测试还发现以下问题,在默认的隔离级别下,对于某一个表t,
1) 如果t.a上有唯一索引或者主键,则
    select * from t where a>'xx' lock in share mode; 会阻塞所有其他在该表上的DML
    select * from t where a<>'xx' lock in share mode;  会阻塞所有其他在该表上的DML
    select * from t where a<'xx' lock in share mode;  如果要修改的值<=xx,则DML会被阻塞;如果要修改的值>xx,则可以正常执行。

2) 如果t.a没有索引或者是普通索引,则以上三个SQL都会阻塞其他的所有DML操作。

我的疑问是:
1)mysql innodb默认使用的是next-key lock锁定方式,但为什么 a>xx会阻塞所有的DML,而a<xx只阻塞部分的DML?按我的理解,这两部分是差不多的,都只会阻塞部分的DML。
2)t.a是普通索引的情况下,为什么所有情况都会阻塞DML操作?是因为锁定代价太高吗?

谢谢

作者: space6212   发布时间: 2011-08-01

这是因为你加了lock in share mode ,这个锁的原因,对于RR模式,没有必要这样做的

推荐阅读文章:MySQL_InnoDB之事务与锁详解

http://www.mysqlops.com/2011/02/ ... AF%A6%E8%A7%A3.html

作者: jinguanding   发布时间: 2011-08-01



QUOTE:原帖由 jinguanding 于 2011-8-1 10:19 发表
这是因为你加了lock in share mode ,这个锁的原因,对于RR模式,没有必要这样做的

推荐阅读文章:MySQL_InnoDB之事务与锁详解

http://www.mysqlops.com/2011/02/ ... AF%A6%E8%A7%A3.html

金兄,你推荐的那个文章没有能解答我的疑问啊。
能否逐一回答下我原帖中疑惑,谢谢了

作者: space6212   发布时间: 2011-08-01