mysql中的锁

来源:互联网 发布:关联交易 数据库 编辑:程序博客网 时间:2024/06/07 17:58

什么是锁?
对于一个数据库来说,有两点需要保证,第一是速度,第二是安全。数据库既要保证能支持高并发的数据访问,又要保证高并发的数据访问不会出错,也就是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(等待图)的方式进行死锁检测
这里写图片描述

原创粉丝点击