MyISAM和InnoDB

原文链接:https://www.cnblogs.com/chenqionghe/p/4845693.html

总结

对于MyISAM的表锁,主要有以下几点:

  1. 共享读锁(S)之间是兼容的,但共享读锁(S)和排他写锁(X)之间,以及排他写锁之间(X)是互斥的,也就是说读和写是串行的。
  2. 在一定条件下,MyISAM允许查询和插入并发执行,我们可以利用这一点来解决应用中对同一表中查询和插入的争锁问题。
  3. MyISAM默认的锁调度机制是写优先,这并不一定适合于所有应用中,用户可以通过设置LOW_PRIPRITY_UPDATES参数,或在INSERT,UPDATE,DELETE语句中指定LOW_PRIORITY选项来调节写锁的争用。
  4. 由于表锁的锁粒度大,读取之间有是串行的,因此,如果更新操作较多,MySIAM表可能会出现严重的锁等待,可以考虑InnoDB表来减少锁冲突。

对于InnoDB表,主要有以下几点

  1. InnoDB的行锁是基于索引实现的,如果不通过索引访问数据,InnoDB会使用表锁。
  2. InnoDB使用间隙锁的目的意识防止幻读,以满足相关隔离级别的要求。另一方面,是为了满足其回复和复制的需要。
  3. 在不同的隔离级别下,InnoDB的锁机制和一致性读策略不同。
  4. MySQL的回复和复制对InnoDB锁机制和一致性读策略也有较大的影响
  5. 锁冲突甚至死锁很难避免。

在了解innoDB的锁特性后,用户可以通过设计和SQL调整等措施减少锁冲突和死锁,包括:

  • 尽量使用较低的隔离级别
  • 精心设计索引,并尽量使用索引访问数据,使枷锁更精确,从而减少锁冲突的机会。
  • 选择合理的事务大小,小事务发生锁冲突的机率也更小。
  • 给记录集显示加锁时,最好一次性请求足够级别的锁。比如要修改数据的话,最好直接申请排他锁,而不是共享锁,修改时再请求排他锁,这样容易产生死锁。
  • 不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽可能一固定的顺序存取表中的行。这样能减小死锁的机会。
  • 对于特定的事务,可以使用表锁来提高处理速度或减少死锁的可能。
    一篇关于MySQL的存储引擎的博客
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章