MySQL的锁机制

浏览:
字体:
发布时间:2013-12-09 23:24:05
来源:

锁是计算机协调多个线程或者线程并发访问某一个资源的机制。MySQL支持对MyISAM和MEMORY存储引擎的表进行表级锁定,对BDB存储引擎的表进行页级锁定和表级锁定,对InnoDB存储引擎的表进行行级锁定和表级锁定。默认情况下,表锁和行锁都是自动获得的,不需要额外的命令。


MySQL中表级锁、行级锁和页面锁的特性可以大致归纳如下:表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度也最高。页面锁:开销和加锁时间介于表锁和行锁之间,会出现死锁,锁定粒度介于表锁和行锁之间,并发度一般。

MyISAM引擎


MyISAM引擎使用的是表锁。对于MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但是会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作。MyISAM的读和写之间,以及写操作之间都是串行的。
MyISAM在执行查询语句前,会自动给涉及的所有表加读锁,在执行更新操作时,会自动给涉及的表加写锁。给MyISAM表显示加锁,一般是为了在一定程度上模拟事务操作,实现对某一时间点多个表的一致性读取。LOCK TABLES可以用于当前线程的表,如果表被其它线程锁定,则当前线程会等待,直到可以获取所有锁定为止。UNLOCK TABLES可以释放当前线程获得的任何锁定。
一个进程请求某个MyISAM表的读锁,同时另外一个进程也请求同一个表的写锁,那么写进程会先获得锁。

InnoDB引擎


InnoDB引擎与MyISAM的最大不同点有两处:一是支持事务,二是采用行级锁。
InnoDB实现了以下两种类型的行锁:共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁;排他锁:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(意向共享锁和意向排他锁)。这两种意向锁都是表锁。意向锁是InnoDB自动加的,不需要用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任意锁。事务可以通过以下语句显示给记录集加共享锁或者排他锁:
共享锁:SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE排他锁:SELECT * FROM table_name WHERE ... FOR UPDATE

InnoDB的行锁实现的特点:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将会使用表锁。因为MySQL的行锁是针对索引加的锁,而不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引建,是会出现锁冲突的。
对于键值在条件范围内但并不存在的记录,叫做间隙。InnoDB会对这个间隙加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。InnoDB使用间隙锁的目的:一是为了防止幻读,二是为了满足其恢复和复制的需要。

死锁问题


MyISAM表锁是deadlock free的,这是因为MyISAM总是一次获得所需要全部锁,要么全部满足,要么等待,因此不会出现死锁。
在InnoDB中,锁是逐步获得的,因此发生死锁是可能的。发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另外一个事务获得锁,并继续完成事务。但在涉及外部锁,或涉及表锁的情况下,InnoDB并不能完全自动检测到死锁,这需要通过设置锁等待超时参数innodb_lock_wait_timeout来解决。
>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();