mysql的锁+事务,联合的地方
全文是对《Mysql 技术内幕 Innodb》中,锁和事务两个章节,自己能看懂或者感兴趣的地方的总结,如有雷同,不是我俩都抄的书,就是他抄我的,peace。写完感觉有点鸡肋,不能帮助新手全面了解mysql 锁和事务,但是我从不同的点来看待了锁和事务。
Innodb 是mysql默认的存储引擎
• 支持事务,
• 行级锁+外键约束
• 两个文件:frm(表定义信息) ,ibd(索引 ---(数据))
• 主键采用聚类索引
• 如果没有指定主键,它会为每一行生成一个6字节的ROWID,以此为主键。
MYISAM另一个存储引擎,
• 不支持事务
• 表级锁
• 三个文件:frm --(你懂的),MYD(数据)MYI(索引--(数据的逻辑地址))
• 采用非聚合索引
在说主题之前想简单的说一下,聚类索引和非聚类索引。
1.聚集索引 . 你想一哈,innodb , 就两个文件,ibd=索引+数据,这个数据一定是在索引的(你一定知道索引是用Btree,或者B+tree实现的)叶子结点上,以上的话针对主键索引。如果是辅索引(就是,不是主键的索引),那么辅索引的叶节点存储就是其的主键的值.

2.非聚集索引
MYI: 索引文件中,叶子结点保存的是数据的逻辑地址,以上的话针对辅索引和主键索引。

锁:Innodb
锁:为了支持对共享资源进行并发访问,提供数据的一致性和完整性。
1.innodb 存储引擎 , 实现了两种标准的行锁
共享锁:(S lock) 允许事务读一行数据
排它锁:(X lock)删除/更新

2.innodb 存储引擎 ,表锁
意向锁:设计目的 为了在一个事务中揭示下一行将被请求的锁类型 , 有一个想要的意思吧
• 意向共享锁:事务想要读取表中的某几行数据
• 意向排它锁:事务想要修改表中的某几行数据
• 由于Innodb存储引擎支持的是行级别的锁,因此意向锁其实不会堵塞除全表扫描以外的任何请求。

书中说:意向锁是将锁定的对象分为多个层次,意向锁意味这事务在更细粒度上进行加锁。
问题一:你有可能想,一个是表锁,一个是行锁,怎么就更细粒度了?
但是向下看:

这里说,如果你想给 记录R加X锁,那么步骤是
• 对数据库A ,表 ,页, 加上IX锁,
• 然后在对记录R 加上X锁
如果在对记录R加X锁之前,已经有事务对表1加上了S锁,之后事务需要对记录R在表上加IX,因为不兼容,所以该事务需要等待表锁操作完成。
那么从这个角度上说,是不是更细化了,有一个想要怎么样的过程?
事务
ACID:百度一大堆,重点想说一下 一致性和隔离性
1 C:一致性,这里想说一下,语法一致?还是语义一致?这里更多的指的是语义上的一致,有人说是质量守恒,类似这个意思。
一致性分为
• DB外部一致性:程序员控制 ,类似转账:A减,B加
• DB内部一致性; DB保证,事务的原子性,全部ok /全部 不ok
2 I :隔离性,这里有4种隔离级别 ,说这个之前我们先来了解一下,下面是想要分享的重点。
一致性非锁定读:
这个意思,Innodb , 存储引擎通过多版本控制的方式来读取当前执行时间数据库中行的数据。(这里有点感觉像乐观锁,一个意思)
解释一下:每行数据都有他的快照,如果你现在是更新,修改,有锁的状态,这个时候我们直接读取他的快照,并不等待这行数据锁的释放。
快照:就是这行数据之前的版本,每行数据有多个版本。
一致性锁定读:
innodb : 会对select ,加两种锁
• select for update ,这个加X锁,这个阻塞其他事务对其加的所有锁
• select lock inshare rode;这个加S锁 , 这和阻塞X锁
接着说隔离级别 ,加上上面的分享:
• 读未提交: 脏读,不可重复读 ,幻读
下面这个都采用一致性非锁定读 , 刚才说,这个读取的都是快照
• 读已提交:读取最新的快照 不可重复读 ,幻读
• 可重复读:读取本事务开始之前的那一份快照 幻读
下面采用 一致性锁定读
• 可串行化:Innodb,会对每一个Select 语句后,自动加上Lock in share mode , 加上S锁,读占用了锁,不在是一致性非锁定读
问题:刚开始的时候,我不太了解,幻读 和 不可重复读的意思?
• 幻读:指的是,数据的行数,更多的是插入,删除操作?
• 不可重复读:指的是,数据本身上的修改。
我们都知道,Mysql innodb默认的隔离级别是重复读,那么,他是怎么解决了不可重复 ,( 后面还说他解决了幻读)。
通过Next --- Key ---Lock锁
什么是Next-key-Lock?
首先介绍一下,innodb,行锁的3种算法
Record Lock:单条索引记录加锁
Gap lock:间隙锁,锁定了一个范围,但是不包含记录本身。
Next-Key-Lock : Record Lock+Gap lock,锁住扫描到的索引,而且还锁住了这个索引覆盖的范围(gap)因此,这个范围内的插入是不允许的。

如果查询的索引含有唯一的属性时,Innodb会对Next key lock 进行又换,将其降级为Record Lock。
说实话,这里就有了一个感性的认识,没什么感觉,看不太懂了,有想法的时候再接着分享吧。
最后分享一下这个

网友评论