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

MYSQL
预防性维护MySQL数据库服务器详解
MySQL服务器内部安全数据目录访问
如何使用MySQL系统的发布与安装
关于MySQL数据库的存储引擎详细介绍
通过数据库引擎来加速MySQL数据库
关于MySQL数据库的用户认证系统分析
在MySQL中获得更好的全文搜索结果
教你如何使用触发器管理MySQL数据库
保护MySQL数据库中重要的数据注意事项
用新的PHP插件实现MySQL为基础的事务
MySQL 4.1数据库中数据转换注意事项
优化MySQL数据库查询的三种方法简介
MySQL数据库批量导入脚本
MySQL中如何灵活运用tips功能
向你介绍MySQL数据库备份的简单知识
通过PHP连接My SQL的两种方法简介
MySQL数据库账户授权的相关管理解析
用Perl DBI连接MySQL数据库
MySQL数据库安全配置
快速修复mysql数据库

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


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

  今天来简单总结一下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>selectcount(*) from content group by content;

  ...

  客户端2:

  mysql>updatecontent 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>updatecontent 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语句都是最优的。)