小仙女讲InnoDB(2)——锁

这集我们说说“锁”。

什么是锁

锁机制用来管理对共享资源的并发访问。

1、lock和latch的区别:

lock和latch都是表示“锁”,不同的是,前者锁的是“事务”,后者锁的是“线程”。我们本文讨论的是lock。
在这里插入图片描述

2、锁的算法:

行锁的算法有3种。
(1)Record Lock
单个行记录上的锁
(2)Gap Lock
间隙锁,锁定一个范围,但不包含记录本身。
(3)Next-key Lock
两个锁的综合,锁定一个范围,且包含锁定记录本身

锁的分类

1、基本锁

基本锁分为2种,其为行锁,所以兼容或排斥是对于同一条记录来说的

  • 共享锁(s):共享锁是一个“友善”的孩子,乐于分享
  • 排他锁(x):排他锁是一个“霸道”的孩子,喜欢吃独份,不喜欢和别人共享

由此可见,只要是存在x锁,就不能共享数据。

2、意向锁

意向锁是表级别的锁,其也分为两种:

  • 意向共享锁
  • 意向排他锁

3、锁定读

(1)一致性非锁定读
如果读取的行正在执行delete或update操作,这时读操作不会因此去等待行上锁的释放,而是去读取行的一个快照数据。这是默认的读取方式。

(2)一致性锁定读:
显示地对数据库读取操作进行加锁以保证数据逻辑的一致性。

4、自增长锁

我们在开发时,经常会用到id的自增长。在InnoDB中,每个含有自增长值的表都有一个自增长计数器,当有数据插入进来时,自增长计数器会计算出值放到自增长列(例如id列)中。
特点:
这是一种表锁,而且其不是在一个事务完成后才释放,而是在完成对自增长值插入的sql语句后立即释放。这样做是为了提高性能。

5、外键锁

外键用于引用完整性的约束检查。在InnoDB中,对于一个外键列,如果没有显式地对这个列加索引,InnoDB会自动对其加一个索引。

锁的问题

1、幻读

在同一个事务下,连续执行两次同样的SQL语句,可能导致不同的结果,第二次的sql语句可能会返回之前不存在的行。

2、 脏读

在不同的事务下,当前事务可以读到另外事务未提交的数据。
事务A读取了事务B未提交的数据,并在这个基础上又做了其它操作。

3、不可重复读

事务A读取了事务B已提交的更改数据。

4、丢失更新

一个事务的更新操作会被另一个事务的更新操作所覆盖,从而导致数据的不一致。

其它问题

1、阻塞:

因为不同锁之间的兼容性关系,在有些时刻,一个事务中的锁需要等待另一个事务中的锁释放他所占用的资源。

2、死锁:

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

3、锁升级:

锁升级是指当前锁的粒度降低。InnoDB不存在锁升级的问题,因为其是根据每个事务访问的每个页对锁进行管理的,而不是根据每个记录。

小结

在这里插入图片描述

发布了258 篇原创文章 · 获赞 769 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/qsbbl/article/details/99103458