博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

上帝他爷

分别担任CU、ITPUB以及CSDN社区的MySQL版主! 我本来想说我是吃屎的! ^_^
  yueliangdao0608.cublog.cn

关于作者
姓名:杨涛
职业:DBA
年龄:25
位置:中国-武汉市
个性介绍:又长了一岁
QQ:38257291
MSN:yueliangdao0608@gmail.com
|| << >> ||
我的分类


【原创】总结一下MySQL中的锁机制

今天来简单总结一下MySQL的锁机制,不妥的欢迎拍砖!

 


1、对于MySQL来说,有三种锁的级别:页级、表级、行级。

页级的典型代表引擎为BDB。
表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。
行级的典型代表引擎为INNODB。

2、我们实际应用中用的最多的就是行锁了。

行级锁的优点如下:
1)、当很多连接分别进行不同的查询时减小LOCK状态。
2)、如果出现异常,可以减少数据的丢失。因为一次可以只回滚一行或者几行少量的数据。
行级锁的缺点如下:
1)、比页级锁和表级锁要占用更多的内存。
2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写操作而不是读操作。
3)、容易出现死锁

3、MySQL用写队列和读队列来实现对数据库的写和读操作。

对于写锁定如下
1)、如果表没有加锁,那么对其加写锁定。
2)、否则,那么把请求放入写锁队列中。

对于读锁定如下:
1)、如果表没有加写锁,那么加一个读锁。
2)、否则,那么把请求放到读锁队列中。

当然我们可以分别用low_priority 以及high_priority在写和读操作上来改变这些行为。


4、下面我来一个简单的例子解释上面的说法。



我们来运行一个时间很长的查询
1)、客户端1:
   mysql> select count(*) from content group by content;
   ...
 客户端2:
   mysql> update content set content = 'I love you' where id = 444;
   Query OK, 1 row affected (30.68 sec)
   Rows matched: 1  Changed: 1  Warnings: 0
   用了半分钟。
2)、我们现在终止客户端1。
 此时客户端2:
   mysql> update content set content = 'I hate you' where id = 444;
   Query OK, 1 row affected (0.02 sec)
   Rows matched: 1  Changed: 1  Warnings: 0
 仅仅用了20毫秒。

这个例子很好的说明了读写队列的运行。
对于1中的客户端1,此时表没有加锁,当然也没有加写锁了,那么此时客户端1对表加了一个读锁。
对于1中的客户端2,此时因为表有一个读锁,所以把UPDATE请求放到写锁定队列中。
当读锁释放的时候,也就是SHOW PROCESSLIST中STATUS 为COPY TO TMP TABLE的时候,UPDATE操作开始执行。


5、
可以在REPLICATION中对MASTER 和SLAVE运用不同的锁定使系统达到最佳的性能。(当然这个前提是SQL语句都是最优的。)

发表于: 2008-07-21,修改于: 2008-07-21 22:10,已浏览471次,有评论6条 推荐 投诉


网友评论
网友: 本站网友 时间:2008-07-26 09:20:46 IP地址:121.34.40.★
能不能更加深入一些,谢谢了。

网友: boean 时间:2008-07-29 17:29:33 IP地址:219.141.229.★
学习了

网友: popgo 时间:2008-08-04 23:18:50 IP地址:222.79.89.★
看看这书: OReilly.High Performance MySQL.chm

网友: popgo 时间:2008-08-04 23:18:54 IP地址:222.79.89.★
看看这书: OReilly.High Performance MySQL.chm

网友: magicgod 时间:2008-09-22 20:58:41 IP地址:221.12.22.★
似乎没有讲应用锁

网友: magicgod 时间:2008-09-22 21:02:31 IP地址:221.12.22.★
应用锁主要有两个函数:GET_LOCK和RELEASE_LOCK,可以用在任何地方,实际上还可以充当一个集群锁。

应用锁有超时限制,一般来说不会死锁,超时之后会自动解锁,性能上很不错,因为实际上不涉及到数据。

 发表评论