(5)mysql优化之MyISAM表锁

概述

MyISAM存储引擎只支持表锁,mysql的表锁有两种模式:读锁和写锁。他们的兼容关系是(对myisam的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作*)和(对myisam的写操作,则会阻塞其他用户对同一表的读和写操作),读写操作是串行的。

概述

MyISAM存储引擎只支持表锁,mysql的表锁有两种模式:读锁和写锁。他们的兼容关系是(对myisam的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作*)和(对myisam的写操作,则会阻塞其他用户对同一表的读和写操作),读写操作是串行的。

如何加表锁

MyISAM在执行查询语句(select)前,会自动给涉及的所有表加上读锁。在执行更新操作(update,delete,insert等)前,会自动给涉及的表加上写锁,这个过程不需要用户干预。如果要显示加锁,参见链接:
http://blog.csdn.net/pursuing0my0dream/article/details/45166975
说明:

  • lock tables
    加上‘local’选项,其作用就是在满足MyISAM表并发插入条件下,允许其他用户在表尾并发的插入记录。
  • 在lock tables
    给表显式加表锁时候,必须同时取得所有涉及表的锁,并且MySQL不支持锁升级。即在执行lock
    tables后,只能访问显式加锁的这些表,不能访问未加锁的表。MyISAM总是一次获取sql语句所需要的全部锁。这就是MyISAM表不会出现死锁的原因。
  • 当使用lock
    tables时,不仅需要一次锁定用到的表,而且,同一个表在sql语句中出现多少次,就要在相同的别名中锁定多少次。

如何加表锁

MyISAM在执行查询语句(select)前,会自动给涉及的所有表加上读锁。在执行更新操作(update,delete,insert等)前,会自动给涉及的表加上写锁,这个过程不需要用户干预。
说明:

lock tables
加上‘local’选项,其作用就是在满足MyISAM表并发插入条件下,允许其他用户在表尾并发的插入记录。
在lock tables
给表显式加表锁时候,必须同时取得所有涉及表的锁,并且MySQL不支持锁升级。即在执行lock
tables后,只能访问显式加锁的这些表,不能访问未加锁的表。MyISAM总是一次获取sql语句所需要的全部锁。这就是MyISAM表不会出现死锁的原因。
当使用lock
tables时,不仅需要一次锁定用到的表,而且,同一个表在sql语句中出现多少次,就要在相同的别名中锁定多少次。

并发插入

在一定的条件下,MyISAM表支持查询和插入并发执行。MyISAm有一个系统变量concurrent_insert,用来专门控制其并发行为的。0-不允许插入;1-如果表没有空洞,允许在表尾插入记录,这是mysql默认设置;2-无论是否有空洞,都允许在表尾插入记录。

网站地图xml地图