MySql三种级别锁的介绍及解锁命令
(2014-04-29 11:59:37)
标签:
那末
用以
便能
页级的典型代表引擎为BDB。
表级的典型代表引擎为MyISAM,MEMORY和很久之前的ISAM。
行级的典型代表引擎为INNODB。
-我们实践操纵中用的最多的等于行锁。
行级锁的劣面以下:
1)、当很多衔接分袂进行不同的查询时减小LOCK状况。
2)、若是显现极度,可以减少数据的丢掉落。因为一次可以只回滚一行概略几行少量的数据。
行级锁的缺点以下:
1)、比页级锁和表级锁要占用更多的内存。
2)、进行查询时比页级锁和表级锁需求的I/O要多,所以我们经常把行级锁用在写操做而不是读操做。
3)、简单显现死锁。
对付写锁定以下:
1)、若是表出有减锁,那末对其减写锁定。
2)、可则,那末把乞请放进写锁行列中。
对付读锁定以下:
1)、若是表出有减写锁,那末减一个读锁。
2)、可则,那末把乞请放到读锁行列中。
虽然我们可以分袂用low_priority 和high_priority在写和读操做上去改变这些举动。
若是想要在一个表上做大量的 INSERT 和 SELECT
操做,但是并行的插进却不可能时,可以将记实插进来一时表中,然后按期将一时表中的数据更新到实践的表里。可以用以下饬令实现:
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
InnoDB 运用行级锁,BDB 运用页级锁。对付 InnoDB 和 BDB 存储引擎去说,是可以或许产存亡锁的。这是因为
InnoDB 会主动捕捉行锁,BDB 会在实施 SQL 语句时捕捉页锁的,而不是在事务的进手下手便这么做。
行级锁的劣面有:
在很多线程乞请不同记及时减少矛盾锁。
事务回滚时减少改变数据。
使长工夫对伶仃的一行记实减锁成为可以或许。
行级锁的缺点有:
比页级锁和表级锁消费更多的内存。
当在大量表中运用时,比页级锁和表级锁更慢,因为他需求乞请更多的所资源。
当需求频繁对大部分数据做 GROUP BY 操做概略需求频繁扫描全部表时,便明隐的比另外锁更糟。
运用更高层的锁的话,便能更等闲的支持各种不同的类型操纵轨范,因为这种锁的开消比行级锁小多了。
表级锁在下列几种状况下比页级锁和行级锁更劣越:
很多操做皆是读表。
在峻厉条件的索引上读与和更新,当更新概略删除可以用伶仃的索引去读与获得时:
UPDATE tbl_name SET column=value WHERE
unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
SELECT 和 INSERT 语句并发的实施,但是只有很少的 UPDATE 和 DELETE 语句。
很多的扫描表和对全表的 GROUP BY 操做,但是出有任何写表。
表级锁和行级锁或页级锁之间的不同的地方借在于:
将同时有一个写和多个读的地方做版本(例如在MySQL中的并发插进)。也等于说,数据库/表支持依照进手下手访谒数据工夫面的不同支持各种不同的试图。另外名有:工夫行程,写复造,概略是按需复造。
实施代码以下:
//实施SQL语句 锁掉落踪stat_num表
$sql = "LOCK TABLES stat_num WRITE";
//表的WRITE锁定,阻塞其他所有mysql查询历程
$DatabaseHandler->exeCute($sql);
//实施更新或写进操做
$sql = "UPDATE stat_num SET `correct_num`=`correct_num`+1 WHERE
stat_date="{$cur_date}"";
$DatabaseHandler->exeCute($sql);
//当前乞请的所有写操做做完后,实施解锁sql语句
$sql = "UNLOCK TABLES";
$DatabaseHandler->exeCute($sql);
原文出处:http://www.jb51.net/article/28287.htm
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。