admin 管理员组

文章数量: 1086019


2024年4月15日发(作者:网站源码博客)

mysql查询更新时的锁表机制分析

创建时间:2010-05-25

文章类别:服务器端

文章大小:4431 Bytes

转载: MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页

级锁定,对InnoDB表进行行级锁定。

在许多情况下,可以根据培训猜测应用程序使用哪类锁定类型最好,但一般很难说出

某个给出的锁类型就比另一个好。一切取决于应用程序,应用程序的不同部分可能需要不

同的锁类型。

为了确定是否想要使用行级锁定的存储引擎,应看看应用程序做什么并且混合使用什

么样的选择和更新语句。例如,大多数Web应用程序执行许多选择,而很少进行删除,

只对关键字的值进行更新,并且只插入少量具体的表。基本MySQL MyISAM设置已经调

节得很好。

在MySQL中对于使用表级锁定的存储引擎,表锁定时不会死锁的。这通过总是在一

个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。

对WRITE,MySQL使用的表锁定方法原理如下:

如果在表上没有锁,在它上面放一个写锁。

否则,把锁定请求放在写锁定队列中。

对READ,MySQL使用的锁定方法原理如下:

如果在表上没有写锁定,把一个读锁定放在它上面。

否则,把锁请求放在读锁定队列中。

当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线

程。

这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。

可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统

上的表锁定争夺:

mysql> SHOW STATUS LIKE 'Table%';

+-----------------------+---------+

| Variable_name | Value |

+-----------------------+---------+

| Table_locks_immediate | 1151552 |


本文标签: 锁定 应用程序 使用 请求 队列