QQ泡沫乐园 · 免费提供游戏辅助,破解软件,活动资讯,喜欢记得收藏哦!
综合软件_线报活动_游戏辅助_最新电影_最优质的的辅助分享平台

大部分支持表、行(默认)级锁,而MyISAM支持表级锁

泡沫乐园 2022-05-23 02:03

12714ca8e440c5c48e7968fa326d5e17.png

86bdccf926693426d6a9017ed985329b.png

InnoDB 支持表和行(默认)级别的锁,而 MyISAM 支持表级别的锁,InnoDB 还支持事务等特性。现在大多数 Internet 应用程序都使用 InnoDB 类型。

数据库锁机制简单来说就是数据库在并发访问时,为了保证数据的一致性,使各种共享资源有序。设计的规则。

fd2a78611e53d073b34c41e2f6eeaf55.png

锁定机制

MySQL 存储引擎使用三种类型(级别)的锁定机制

MyISAM 使用表级锁

InnoDB支持行级锁和表级锁,默认是行级锁

BDB引擎的页级锁不在本文讨论范围内,并不常见。如果面试官问,那就太教条了。

锁的种类

从锁的种类来看,有共享锁和排他锁

共享锁:共享锁也称为读锁,是通过读操作创建的锁。其他用户可以并发读取数据,但在所有共享锁都被释放之前,任何事务都不能对数据进行修改(获取数据的排他锁)。

SELECT ... LOCK IN SHARE MODE;

排他锁:排他锁也称为写锁。当用户想要写入数据时,会对数据应用排他锁。只能添加一个独占锁,与其他独占锁和共享锁互斥。

SELECT ... FOR UPDATE;

在查询语句后添加FOR UPDATE,Mysql会对查询结果中的每一行添加一个排他锁,当查询结果集中没有其他线程时,当任何行使用排他锁时,都可以成功申请一个排他锁表行锁定的时候能查询么,否则会被阻塞。

共享锁和排他锁是mysql系统实现的功能。以下乐观锁和悲观锁是我们用来实现系统锁的用户级锁机制。

乐观锁:乐观锁

假设数据一般不会引起冲突,所以在提交和更新数据时,会正式检测到数据冲突。表行锁定的时候能查询么,如果发现冲突,让用户返回错误信息,让用户决定怎么做。

数据版本的实现方式有两种,第一种是使用版本号,第二种是使用时间戳。

表行锁定的时候能查询么_盛世国际表行有假表么?_excel锁定行

版本号实现如下

update order
set status=2,version=version+1
where id=#{id} and version=#{version};

乐观并发控制认为事务之间发生数据竞争和并发的概率比较小。所以尽量做到直到提交锁的时候,这样就不会有锁和死锁。比如两个事务同时并发读取数据库的一行,修改后写回数据库时会出现问题。

悲观锁:悲观锁

在整个数据处理过程中数据被锁定。悲观锁的实现往往依赖于数据库提供的锁机制(只有数据库层提供的锁机制才能真正保证数据访问的排他性。否则即使在这个系统中实现了锁机制,也不能保证外部系统不会被修改。数据)

悲观锁的使用方法:

//0.开始事务
begin;
//1.查询出商品信息
select status from goods where id=1 for update;
//2.根据商品信息生成订单
insert into orders (id,goods_id) values (null,1);
//3.修改商品status为2
update goods set status=2;
//4.提交事务
commit;

可以看到,悲观锁的概念就是不管怎么加排他锁。然后在业务提交后释放排他锁,比如处理业务等业务。在此期间任何其他争用锁都会报错。​​

表级锁定 MyISAM存储引擎使用的锁定机制完全由MySQL提供的表级锁定实现

MySQL表级锁有两种模式:表共享读锁(Table Read Lock)和表写锁。

锁定模式的兼容性:

MyISAM 表读写,串行写入。当一个线程在一张表上获得写锁时,只有持有该锁的线程才能更新该表。其他线程的读写操作会等到锁被释放。

行级锁定 行级锁定不是 MySQL 自己实现的锁定方式,而是由其他存储引擎实现的,比如著名的 InnoDB 存储引擎

InnoDB 还有两种行级锁,共享锁和排他锁。为了让行级锁和表级锁在锁定机制的实现过程中能够共存,InnoDB 还使用了意图锁(table-level locks)的概念。 ,有有意共享锁和有意排他锁两种。

InnoDB 行锁是通过将索引项锁定在索引上来实现的。 InnoDB 只有在通过索引条件检索数据时才使用行级锁。否则,InnoDB 将使用表锁。锁

面试过程中也可能会问到以下几种情况

InnoDB存储引擎的锁算法

一共有三种

-  Record lock:单个行记录上的锁
-  Gap lock:间隙锁,锁定一个范围,不包括记录本身
-  Next-key lock:record+gap 锁定一个范围,包含记录本身

b7b0dc18e7b1b7dcd7247f76cbbb2f22.png