MySQL 中MyISAM 表级锁和InnoDB 行级锁的实现特点
2014-03-05 22:06
381 查看
重点介绍了MySQL 中MyISAM 表级锁和InnoDB 行级锁的实现特点,并讨论了两种
存储引擎经常遇到的锁问题和解决办法。
对于MyISAM 的表,主要讨论了以下几点:
共享读锁(S)之间是兼容的,但共享读锁(S)与排他写锁(X)之间,以及排他
写锁(X)之间是互斥的,也就是说读和写是串行的。
在一定条件下,MyISAM 允许查询和插入并发执行,我们可以利用这一点来解决
应用中对同一表查询和插入的锁争用问题。
MyISAM 默认的锁调度机制是写优先,这并不一定适合所有应用,用户可以通过
设置LOW_PRIORITY_UPDATES 参数,或在INSERT、UPDATE、DELETE 语句中指定
LOW_PRIORITY 选项来调节读写锁的争用。
由于表锁的锁定粒度大,读写之间又是串行的,因此,如果更新操作较多,MyISAM
表可能会出现严重的锁等待,可以考虑采用InnoDB 表来减少锁冲突。
对于InnoDB 表,主要讨论了以下几项内容。
InnoDB 的行锁是基于锁引实现的,如果不通过索引访问数据,InnoDB 会使用表锁。
介绍了InnoDB 间隙锁(Next-key)机制,以及InnoDB 使用间隙锁的原因。
在不同的隔离级别下,InnoDB 的锁机制和一致性读策略不同。
MySQL 的恢复和复制对InnoDB 锁机制和一致性读策略也有较大影响。
锁冲突甚至死锁很难完全避免。
在了解InnoDB 锁特性后,用户可以通过设计和SQL 调整等措施减少锁冲突和死锁,包括:
尽量使用较低的隔离级别;
精心设计索引,并尽量使用索引访问数据,使加锁更精确,从而减少锁冲突的机会;
选择合理的事务大小,小事务发生锁冲突的几率也更小;
给记录集显示加锁时,最好一次性请求足够级别的锁。比如要修改数据的话,最好
直接申请排他锁,而不是先申请共享锁,修改时再请求排他锁,这样容易产生死锁;
不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽
可能以固定的顺序存取表中的行。这样可以大大减少死锁的机会;
尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响;
不要申请超过实际需要的锁级别;除非必须,查询时不要显示加锁;
对于一些特定的事务,可以使用表锁来提高处理速度或减少死锁的可能。
存储引擎经常遇到的锁问题和解决办法。
对于MyISAM 的表,主要讨论了以下几点:
共享读锁(S)之间是兼容的,但共享读锁(S)与排他写锁(X)之间,以及排他
写锁(X)之间是互斥的,也就是说读和写是串行的。
在一定条件下,MyISAM 允许查询和插入并发执行,我们可以利用这一点来解决
应用中对同一表查询和插入的锁争用问题。
MyISAM 默认的锁调度机制是写优先,这并不一定适合所有应用,用户可以通过
设置LOW_PRIORITY_UPDATES 参数,或在INSERT、UPDATE、DELETE 语句中指定
LOW_PRIORITY 选项来调节读写锁的争用。
由于表锁的锁定粒度大,读写之间又是串行的,因此,如果更新操作较多,MyISAM
表可能会出现严重的锁等待,可以考虑采用InnoDB 表来减少锁冲突。
对于InnoDB 表,主要讨论了以下几项内容。
InnoDB 的行锁是基于锁引实现的,如果不通过索引访问数据,InnoDB 会使用表锁。
介绍了InnoDB 间隙锁(Next-key)机制,以及InnoDB 使用间隙锁的原因。
在不同的隔离级别下,InnoDB 的锁机制和一致性读策略不同。
MySQL 的恢复和复制对InnoDB 锁机制和一致性读策略也有较大影响。
锁冲突甚至死锁很难完全避免。
在了解InnoDB 锁特性后,用户可以通过设计和SQL 调整等措施减少锁冲突和死锁,包括:
尽量使用较低的隔离级别;
精心设计索引,并尽量使用索引访问数据,使加锁更精确,从而减少锁冲突的机会;
选择合理的事务大小,小事务发生锁冲突的几率也更小;
给记录集显示加锁时,最好一次性请求足够级别的锁。比如要修改数据的话,最好
直接申请排他锁,而不是先申请共享锁,修改时再请求排他锁,这样容易产生死锁;
不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽
可能以固定的顺序存取表中的行。这样可以大大减少死锁的机会;
尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响;
不要申请超过实际需要的锁级别;除非必须,查询时不要显示加锁;
对于一些特定的事务,可以使用表锁来提高处理速度或减少死锁的可能。
相关文章推荐
- mysql数据表引擎InnoDB和MyISAM的特点
- MySQL之索引1 --- MyISAM和InnoDB索引实现的不同
- 面试常考 MySQL优化 事务处理 MyISAM和InnoDB索引实现
- InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!
- InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!
- MyISAM与Innodb引擎的特点和区别 (MySQL面试)
- MySQL原理研究:myisam和innodb索引实现的不同
- MySQL中MyISAM和InnoDB对B-Tree索引不同的实现方式
- MySQL中MyISAM和InnoDB两种主流存储引擎的特点
- mysql 两种存储引擎 MyISAM 和InnoDB
- Mysql中MyISAM、InnoDB两种表类型的区别
- mysql 存储引擎 InnoDB和myisam存储引擎的区别 /(自己小结)
- mysql中engine=innodb和engine=myisam的区别
- MySQL存储引擎--MyISAM与InnoDB区别
- 面试宝典系列-mysql引擎Innodb和MyISAM的区别
- Mysql存储引擎------InnoDB 与MyISAM
- MySQL InnoDB MVCC实现原理
- MySQL各存储引擎(INNODB,MyISAM等)的区别及其启动方法
- MySQL MyISAM/InnoDB高并发优化经验(网络来源)
- mysql中engine=innodb和engine=myisam的区别