« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
本博客在此声明所有文章均为转摘,只做资料收集使用。并无其他商业用途。 |
Blog信息 |
blog名称: 日志总数:210 评论数量:205 留言数量:-19 访问次数:918397 建立时间:2007年5月10日 |

| |
[MYSQL]Mysql InnoDB表锁问题 文章收藏, 网上资源, 软件技术, 电脑与网络
李小白 发表于 2009/3/22 23:25:11 |
在讨论问题之前,先看下面的mysql信息
Mysql代码 500)this.width=500'>
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> 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阻塞。
目前已知的解决方法有两种:
不用auto increment字段,自己维护主键生成。该方法中选择主键生成策略很重要, 要综合考虑简单和效率问题。假设使用uuid,虽然简单但是会造成该表的主键效率很低(innodb的主键是特殊的index,其他的index会引用主键,详见mysql文档)。
升级到最新的5.1版本。mysql在5.1.22版本以后提供了不同方式的auto-inc配置
Mysql代码 500)this.width=500'>
innodb_autoinc_lock_mode = 0 (“traditional” lock mode)
innodb_autoinc_lock_mode = 1 (“consecutive” lock mode)
innodb_autoinc_lock_mode = 2 (“interleaved” lock mode) 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:使用复制功能时请详细阅读文档
|
|
|