Innodb+锁

Innodb中的行锁是通过索引来加的,如果不是通过索引,就只能建立表锁
1、简单说明线程中的锁和数据库中的锁区别
在这里插入图片描述

2.Innodb中的锁
共享锁:允许事务读一行数据
排它锁:允许事务删除或更新一行数据
Innodb支持多粒度锁定,这种锁定允许事务在行级上的锁和表级上的锁同时存在。为了支持不同粒度上进行加锁操作,Innodb存储引擎支持一种额外的锁方式,称为意向锁。意向锁是将锁定的对象分为多个层次,意向锁意味着事物希望在更细粒度上进行加锁。
若将上锁的对象看成一棵树,那么对最下层的对象上锁,也就是对最细粒度的对象进行上锁,首先需要对粗粒度的对象上锁。如果要对页进行上X锁,就需要对数据库,表上意向锁IX,最后对页上X锁。若其中一部分导致等待,那么该操作需要等待粗粒度锁的完成。
Innod支持两种意向锁:
意向共享锁:事务想要获得一张表中某几行的共享锁。
意向排它锁:事务想要获得一张表中某几行的排它锁
兼容性

(表级加X锁,其他全白给。表级加S锁,可以加S锁兼容)
(表级意向锁互不影响,因为他们需要到具体的行中看具体的锁)

3.一致性非锁定读(Innodb默认设置下的默认读取方式)
Innodb存储引擎通过行多版本控制的方式来读取当前执行时间数据库中行的数据。如果读取的航正在执行DELETE或UPDATE操作,这时读取操作不会因此去等待航上锁的释放。相反,Innodb存储引擎会去读取行的一个快照数据。
快照数据是指该行执行的之前版本的数据,该实现是通过undo段来完成的,undo是用来事务中的回滚数据,因此快照数据本身没有额外的开销。此外,读取快照数据是不需要上锁的,因为没有事务需要对历史数据进行修改操作。
快照数据就是当前行数据之前的历史版本,每行记录可能有多个版本,一个行记录可能又不止一个快找数据,一般称这种技术为行多版本技术。由此带来的并发控制,称之为多版本并发控制(MVCC)
四个隔离级别具体的实现随便百度就有。
总结就是:
读未提交:不读回滚里的数据。正在加锁的也读。

脏读,不可重复读,幻读

读已提交:只读最新的已提交版本。(undo中的第一个)

不可重复读,幻读

可重复读:只读事务开始时就已经提交的版本。(和读已提交没啥本质区别,就是快照数据的不一样。但是一般为了保证数据的逻辑有效性,其实一般还会给行加上读锁,不允许其他事务更改。)

幻读

可串行化:数据按照串行一个一个来。

开销大,并发低

4.一致性锁定读
在默认配置下,即事务的隔离级别为可重复读模式下,Innodb存储引擎的select操作使用一致性非锁定读。但是在某些情况下,用户需要显示的对数据库读取操作进行加锁以保证数据逻辑的一致性。而这要求数据库支持加锁语句。Innodb存储引擎对于select语句支持两种一致性的锁定读操作:

select 。。。for update 对行数据加写锁
select 。。。lock in share mode 对行数据加读锁

事务提交,锁释放
即使加了x锁,一致性非锁定读(默认的就是这个)也可以进行读取。

5.解决幻读
Innodb有三种行锁的算法,分别为:

record lock:单个记录上的锁
gap lock:间隙锁,锁定一个范围,但不包含记录本身。
next-key lock:gap+record。锁定一个范围,并且锁定记录本身。

在默认的事务隔离级别下,即可重复读,Innodb使用next-key locking机制避免幻象问题(幻读)。其它数据库是在可串行化的隔离级别才解决幻读问题。
幻读是指在同一事务中,连续执行两次同样的sql语句可能导致不同的结果,第二次的sql语句可能返回之前不存在的行。

6.锁的问题

脏读:你懂的
不可重复读:你懂的
丢失更新:mysql中不会出现。因为mysql中,但凡是dml操作(dml:数据操作语言,ddl:数据创建语言)都需要加写锁。
阻塞:因为不同所之间的兼容性问题,在有些时刻一个事务中的锁需要等待另一个锁释放它所占用的资源,这就是阻塞
幻读:懂的都懂

7.死锁
死锁是指两个或两个以上事务在执行过程中,因争夺所资源而造成的一种互相等待的现象。
1)超时
两个事物互相等待时,当一个等待时间超过设置的某一阈值是,其中一个事务进行回滚,另一个等待的食物就能继续进行。
缺点:通过FIFO(先来先出)的顺序选择会滚对象,但若超市的事务所张权重比较大,如食物更新了很多行,占用了较多的undo log,这时采用FIFO的方式就不太合适,因为回滚一个事务的时间相对另一个事务所占用的时间可能会很多。
2)等待图(wait-for graph)
要求数据库保存以下两种信息:
锁的信息链表
事务等待表
通过上述链表可以构造出一张图。而在这个图中
在这里插入图片描述

图片书名《MySQL技术内幕InnoDB存储引擎》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值