您的位置:首页 > 数据库 > MySQL

mysql中的锁

2017-10-17 10:31 211 查看
什么是锁?

对于一个数据库来说,有两点需要保证,第一是速度,第二是安全。数据库既要保证能支持高并发的数据访问,又要保证高并发的数据访问不会出错,也就是mysql的锁机制,锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问

mysql中数据库锁的分类:



mysql中的锁可以基本划分为lock和latch(闩锁\轻量级的锁),lock分为行锁、表锁、意向锁。 latch分为读写锁和互斥量。

关于latch:http://www.cnblogs.com/data-zhang/p/6971718.html

锁的类型:

锁可以分为读锁和写锁两种,也叫共享锁(S)和排他锁(X)。



读锁与读锁可以兼容,写锁与任和锁都不兼容。

还有两种锁,意向共享锁(IS),意向排他锁(IX):



锁的粒度

意向排他锁和意向共享锁的锁粒度是整个表, 排它锁和共享锁锁定的是记录,也就是行级锁。

读锁的应用:

读锁本身是一种共享锁,但是读锁本身也有两种方式,一致性的非锁定读、一致性的锁定读:

一致性非锁定读:



一致性非锁定读不会锁定数据行,而是锁定数据行的快照,即生成新的数据快照,并加锁。

一致性的锁定读:

顾名思义,这种读取的方式会锁定数据行,有以下的两种方式。

Select …… for update

Select …… LOCK IN SHARE MODE

更新丢失以及处理办法:

假设有这样一种情况:



这种情况下User1修改的数据就会丢失,解决办法是直接加锁:

select * from user where id=1 for update;

INNODB行锁的算法

Record Lock:单行记录上的锁

Gap Lock:间隙锁,锁定一个范围,但不锁定记录

Next Key Lock:Gap Lock+Record Lock锁定一个范围并且锁定记录本身

行锁很容易理解,就是对一个数据行加锁,间隙锁是指的是锁锁定一个“间隙”,一个范围。 【删除不存在的对象会产生间隙锁,且可能造成死锁。】, next key lock 是两者的结合,锁定对象和范围。

死锁

死锁是指两个或者两个以上事务执行过程中,因争夺锁资源而造成的一种相互等待的现象。

死锁的解决方式:

1,超时

2,采用wait-for gragh(等待图)的方式进行死锁检测

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql mysql锁