当前位置: 首页 > 图文教程 > 数据库 > MYSQL > Mysql教程:对MySQL中的锁机制的总结

MYSQL
Linux环境MySQL服务器级优化讲解
MySQL在命名用过程中所遇到的常见问题
MySQL数据库只监听某个特定地址的方法
MySQL数据库管理必备工具 phpMyAdmin 3.0
MySQL中两种快速创建空表的方式的区别
讲解MySQL数据库的数据类型和建库策略
请正确认识MySQL对服务器端光标的限制
如何在MySQL查询结果集中得到记录行号
在SUSE10环境下安装和配置MySQL数据库
由浅入深讲解MySQL数据库索引的选择性
轻松掌握MySQL数据库锁机制的相关原理
一种特别简单的MySQL数据库安装方法
实例讲解如何配置MySQL数据库主从复制
MySQL数据库中的重要数据应当如何保护
详细讲解MySQL数据库对文件操作的封装
深入了解MySQL的数据类型以及建库策略
解决MySQL数据库中与优化器有关的问题
向MySQL数据库的表中录入数据的实用方法
MySQL数据库中的各种乱码及其解决方法
快速掌握怎样选择准备安装的 MySQL版本

MYSQL 中的 Mysql教程:对MySQL中的锁机制的总结


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 88 ::
收藏到网摘: n/a

原文链接:http://blog.chinaunix.net/u/29134/showart_1087632.html

今天来简单总结一下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语句都是最优的。)