浏览 4178 次
锁定老帖子 主题:Mysql InnoDB表锁问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-23
最后修改:2009-02-23
在讨论问题之前,先看下面的mysql信息 mysql> show status like "%table_lock%"; +-----------------------+---------+ | Variable_name | Value | +-----------------------+---------+ | Table_locks_immediate | 1290950 | | Table_locks_waited | 1069 | +-----------------------+---------+ 2 rows in set (0.01 sec)
mysql版本5.0.77, 使用的存储引擎是innodb,而该引擎最主要的特点是transactional和row lock。按理说不会出现表锁才对,但是事实是出现了,并且锁的争用很严重。
查看mysql文档会发现,虽然innodb使用的的row lock,但是在处理具有auto increment字段的表的时候,会使用一种特殊的表锁——AUTO-INC。简单来说就是innodb会在内存里保存一个计数器用来记录auto_increment的值,当插入数据时,就会用一个表锁来锁住这个计数器,直到插入结束。一条一条插入问题不大,但是如果高并发插入,就会造成sql阻塞。
目前已知的解决方法有两种:
innodb_autoinc_lock_mode = 0 (“traditional” lock mode) innodb_autoinc_lock_mode = 1 (“consecutive” lock mode) innodb_autoinc_lock_mode = 2 (“interleaved” lock mode)
可以参考文档http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html PS:使用复制功能时请详细阅读文档
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-03-06
不错, 不过, 你要这么高的写入性能? innodb合适么
|
|
返回顶楼 | |