当前位置: 首页 > news >正文

如何做彗聪网站呢电子商务网页制作

如何做彗聪网站呢,电子商务网页制作,藁城网络推广,甘肃省城乡城乡建设厅网站首页1. 写在前面 在数据库系统中,幻读(Phantom Read)是指在一个事务中,两次读取同一范围的数据集时,由于其他事务的插入操作,导致第二次读取结果集发生变化的问题。InnoDB 作为 MySQL 的一个存储引擎&#xff…

1. 写在前面

在数据库系统中,幻读(Phantom Read)是指在一个事务中,两次读取同一范围的数据集时,由于其他事务的插入操作,导致第二次读取结果集发生变化的问题。InnoDB 作为 MySQL 的一个存储引擎,通过多种机制来解决幻读问题,主要包括锁机制和隔离级别。

2. 幻读问题的产生

假设有一个事务 T1,它在某个条件下查询了一批记录。在 T1 进行第一次查询后,如果另一个事务 T2 在 T1 的查询范围内插入了新的记录,那么当 T1 再次查询时,会发现多出了 T2 插入的记录,这就是幻读。

3. InnoDB 如何解决幻读

InnoDB 通过以下两种主要机制来解决幻读问题:

  1. Next-Key Locks(间隙锁)
  2. MVCC(多版本并发控制)

3.1 Next-Key Locks

Next-Key Locks(间隙锁)是 InnoDB 存储引擎在实现可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)隔离级别时使用的一种锁机制。它结合了记录锁和间隙锁,用于锁定一个记录及其前后的间隙,防止其他事务在间隙中插入新的记录,从而避免幻读。

3.1.1 组成

Next-Key Locks 是记录锁(Record Lock)和间隙锁(Gap Lock)的组合。具体来说:

  • 记录锁(Record Lock):锁定单个记录,防止其他事务对该记录进行修改。
  • 间隙锁(Gap Lock):锁定记录之间的间隙,防止其他事务在间隙中插入新的记录。

3.1.2 工作原理

Next-Key Locks 的工作原理是通过锁定一个记录及其前后的间隙,确保在一个事务中,任何插入操作都不会影响到该事务已经读取的数据范围,从而避免幻读。
假设有一个表 employees,包含以下数据:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees (id, name) VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');

在可重复读隔离级别下,事务 T1 和 T2 的操作如下:

-- 事务 T1
START TRANSACTION;
SELECT * FROM employees WHERE id BETWEEN 1 AND 3;-- 事务 T2
START TRANSACTION;
INSERT INTO employees (id, name) VALUES (4, 'David');
COMMIT;-- 事务 T1
SELECT * FROM employees WHERE id BETWEEN 1 AND 3;
COMMIT;

在上述操作中,T1 在第一次查询时会锁定 id 在 1 到 3 之间的记录及其前后的间隙:

  • 锁定记录 id=1 及其前后的间隙 (-∞, 1]
  • 锁定记录 id=2 及其前后的间隙 (1, 2]
  • 锁定记录 id=3 及其前后的间隙 (2, 3]
  • 锁定记录 id=4 及其前后的间隙 (3, +∞)

由于 T1 使用的是可重复读隔离级别,InnoDB 通过 Next-Key Locks 确保 T1 在第二次查询时,读取的结果集不会受到 T2 插入操作的影响,从而避免了幻读。

3.1.3 Next-Key Locks 的应用场景

Next-Key Locks 主要应用于以下隔离级别:

  • 可重复读(REPEATABLE READ):在该隔离级别下,InnoDB 使用 Next-Key Locks 确保在一个事务中,读取的数据集在整个事务期间保持一致,避免幻读。
  • 串行化(SERIALIZABLE):在该隔离级别下,InnoDB 通过 Next-Key Locks 确保所有读取操作都加锁,事务之间完全隔离,避免幻读。

3.1.4 Next-Key Locks 的优缺点

优点:

  • 避免幻读:通过锁定记录及其前后的间隙,Next-Key Locks 可以有效避免幻读问题。
  • 数据一致性:在高并发环境下,Next-Key Locks 可以确保数据的一致性

缺点:

  • 锁粒度较大:由于 Next-Key Locks 锁定了记录及其前后的间隙,锁粒度较大,可能会影响并发性能。
  • 死锁风险:在高并发环境下,Next-Key Locks 可能会导致死锁,需要进行死锁检测和处理。
    死锁的详细原因下面我们展开说。

3.2 间隙锁(Gap Lock)

间隙锁是 Next-Key Locks 的一个重要组成部分,用于锁定记录之间的间隙,防止其他事务在间隙中插入新的记录。间隙锁的范围包括:

  • 起始记录之前的间隙,例如 (-∞, 1)
  • 两条记录之间的间隙,例如 (1, 2)
  • 结束记录之后的间隙,例如 (3, +∞)
    通过锁定这些间隙,InnoDB 可以确保在一个事务中,任何插入操作都不会影响到该事务已经读取的数据范围,从而避免幻读。

3.3 MVCC(多版本并发控制)

多版本并发控制(MVCC, Multi-Version Concurrency Control)是一种用于管理数据库并发访问的技术。MVCC 通过为每个事务提供一个一致的视图,确保在高并发环境下,事务可以独立地进行读写操作,而不会相互干扰。InnoDB 存储引擎在实现可重复读(REPEATABLE READ)和读已提交(READ COMMITTED)隔离级别时,广泛使用了 MVCC 技术。

3.3.1 基本原理

MVCC 的核心思想是为每个数据行维护多个版本,并通过版本号或时间戳来区分这些版本。每个事务在读取数据时,会根据事务开始时的快照视图,读取符合其版本号或时间戳的数据。这样,不同事务可以同时读取和写入数据库,而不会相互阻塞。
数据版本
在 InnoDB 中,每行数据都有两个隐藏的列,用于实现 MVCC:

  • 事务 ID(Transaction ID):表示创建或最后修改该行数据的事务 ID。
  • 回滚指针(Rollback Pointer):指向数据行的前一个版本,用于实现回滚操作。

当一个事务对数据行进行修改时,会创建该数据行的一个新版本,并更新事务 ID 和回滚指针。

3.3.2 实现细节

MVCC 主要通过以下两个操作来实现:

  • 快照读(Snapshot Read)
  • 当前读(Current Read)
3.3.2.1 快照读(Snapshot Read)

快照读是指事务读取数据时,读取的是数据的快照版本,而不是当前最新的数据。快照版本是事务开始时的数据状态。快照读不会加锁,因此可以实现高效的并发访问。
快照读的典型操作包括:
SELECT 语句(不带 FOR UPDATE 或 LOCK IN SHARE MODE)
这个面试被问过,大家注意

3.3.2.2 当前读(Current Read)

当前读是指事务读取数据时,读取的是当前最新的数据,并且会对读取的数据加锁,以确保数据一致性。当前读通常用于更新操作。

当前读的典型操作包括:

  • SELECT … FOR UPDATE
  • SELECT … LOCK IN SHARE MODE
  • UPDATE
  • DELETE
  • INSERT

3.3.3 MVCC 在不同隔离级别下的表现

MVCC 在不同的隔离级别下有不同的表现:

  1. 读未提交(READ UNCOMMITTED):在该隔离级别下,事务可以读取其他事务未提交的数据,不使用 MVCC。
  2. 读已提交(READ COMMITTED):在该隔离级别下,事务每次读取数据时,读取的是当前最新的已提交版本。MVCC 确保事务读取的数据是已提交的最新版本。
  3. 可重复读(REPEATABLE READ):在该隔离级别下,事务在整个生命周期内,读取的是事务开始时的一致性视图。MVCC 确保事务读取的数据在整个事务期间保持一致。
  4. 串行化(SERIALIZABLE):在该隔离级别下,事务之间完全隔离,所有读取操作都加锁,不使用 MVCC。

3.3.4 MVCC 的优缺点

优点:

  • 高并发性能:通过快照读,事务可以在不加锁的情况下读取数据,提高了并发性能。
  • 减少锁争用:MVCC 避免了读写锁争用问题,提高了系统的吞吐量。
  • 数据一致性:通过为每个事务提供一致性视图,MVCC 确保了数据的一致性和隔离性。

缺点:

  • 存储开销:由于每行数据需要维护多个版本,MVCC 会增加存储开销。
  • 垃圾回收:需要定期清理过期的版本数据,以防止存储空间的浪费。
  • 实现复杂:MVCC 的实现需要维护复杂的数据结构和版本管理逻辑。

假设有一个表 employees,包含以下数据:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees (id, name) VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');

在可重复读隔离级别下,事务 T1 和 T2 的操作如下:

-- 事务 T1
START TRANSACTION;
SELECT * FROM employees WHERE id = 1;-- 事务 T2
START TRANSACTION;
UPDATE employees SET name = 'Bob Updated' WHERE id = 2;
COMMIT;-- 事务 T1
SELECT * FROM employees WHERE id = 2;
COMMIT;

在上述操作中,T1 在第一次查询时读取了 id=1 的记录。此时,T2 更新了 id=2 的记录,并提交了事务。由于 T1 使用的是可重复读隔离级别,InnoDB 通过 MVCC 确保 T1 在第二次查询时,读取的 id=2 的记录仍然是事务开始时的一致性视图,而不是 T2 更新后的数据。

4. 高并发环境下,Next-Key Locks 死锁分析

在高并发环境下,Next-Key Locks(间隙锁)可能会导致死锁的原因主要包括以下几个方面:

4.1 锁竞争

在高并发环境中,多个事务可能会同时尝试锁定相同的记录或间隙。由于 Next-Key Locks 锁定的范围较大,锁竞争的概率增加。例如,两个事务可能会同时尝试插入不同的记录,但由于间隙锁的存在,它们可能会互相等待对方释放锁,从而导致死锁。
假设有一个表 employees,包含以下数据:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees (id, name) VALUES (1, 'Alice'), (3, 'Charlie');

在高并发环境下,事务 T1 和 T2 的操作如下:

-- 事务 T1
START TRANSACTION;
SELECT * FROM employees WHERE id = 1;
-- 锁定记录 id=1 及其前后的间隙 (-∞, 1] 和 (1, 3)-- 事务 T2
START TRANSACTION;
SELECT * FROM employees WHERE id = 3;
-- 锁定记录 id=3 及其前后的间隙 (1, 3] 和 (3, +∞)-- 事务 T1
INSERT INTO employees (id, name) VALUES (2, 'Bob');
-- 尝试锁定间隙 (1, 3),但被事务 T2 锁定-- 事务 T2
INSERT INTO employees (id, name) VALUES (2, 'David');
-- 尝试锁定间隙 (1, 3),但被事务 T1 锁定

在上述操作中,T1 和 T2 互相等待对方释放间隙锁,从而导致死锁。

4.2 锁顺序不一致

如果不同事务获取锁的顺序不一致,也可能导致死锁。例如,一个事务先锁定记录 A 再锁定记录 B,而另一个事务先锁定记录 B 再锁定记录 A,这种锁顺序的不一致可能导致两个事务互相等待对方释放锁,从而导致死锁。
假设有一个表 employees,包含以下数据:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees (id, name) VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');

在高并发环境下,事务 T1 和 T2 的操作如下:

-- 事务 T1
START TRANSACTION;
SELECT * FROM employees WHERE id = 1;
-- 锁定记录 id=1 及其前后的间隙 (-∞, 1] 和 (1, 2)-- 事务 T2
START TRANSACTION;
SELECT * FROM employees WHERE id = 3;
-- 锁定记录 id=3 及其前后的间隙 (2, 3] 和 (3, +∞)-- 事务 T1
SELECT * FROM employees WHERE id = 3;
-- 尝试锁定记录 id=3 及其前后的间隙 (2, 3] 和 (3, +∞),但被事务 T2 锁定-- 事务 T2
SELECT * FROM employees WHERE id = 1;
-- 尝试锁定记录 id=1 及其前后的间隙 (-∞, 1] 和 (1, 2),但被事务 T1 锁定

在上述操作中,T1 和 T2 获取锁的顺序不一致,导致互相等待对方释放锁,从而导致死锁。

4.3 锁粒度较大

Next-Key Locks 锁定的范围较大,包括记录及其前后的间隙,这增加了锁冲突的概率。在高并发环境下,锁粒度较大的情况下,多个事务可能会同时尝试锁定相同的间隙,从而导致死锁。
假设有一个表 employees,包含以下数据:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees (id, name) VALUES (1, 'Alice'), (3, 'Charlie');

在高并发环境下,事务 T1 和 T2 的操作如下:

-- 事务 T1
START TRANSACTION;
SELECT * FROM employees WHERE id BETWEEN 1 AND 3;
-- 锁定记录 id=1 和 id=3 及其前后的间隙 (-∞, 1]、(1, 3] 和 (3, +∞)-- 事务 T2
START TRANSACTION;
INSERT INTO employees (id, name) VALUES (2, 'Bob');
-- 尝试锁定间隙 (1, 3),但被事务 T1 锁定-- 事务 T1
INSERT INTO employees (id, name) VALUES (4, 'David');
-- 尝试锁定间隙 (3, +∞),但被事务 T2 锁定

在上述操作中,T1 和 T2 由于锁粒度较大,互相等待对方释放锁,从而导致死锁。

4.4 解决死锁的方法

  • 合理设计事务:尽量减少事务的执行时间,避免长时间持有锁。
  • 统一锁定顺序:确保不同事务获取锁的顺序一致,避免锁顺序不一致导致的死锁。
  • 分解大事务:将大事务分解为多个小事务,减少锁粒度和锁冲突的概率。
  • 死锁检测和回滚:InnoDB 内置了死锁检测机制,可以自动检测到死锁并回滚其中一个事务。应用程序可以捕获死锁异常并重试操作。

粉丝福利

博主经营的脱单圈子,定期组织线下免费活动,有兴趣的单身小伙伴可以添加
在这里插入图片描述


文章转载自:
http://misname.yrpg.cn
http://sheepcote.yrpg.cn
http://spearfisherman.yrpg.cn
http://cervicitis.yrpg.cn
http://silundum.yrpg.cn
http://gapeseed.yrpg.cn
http://playdown.yrpg.cn
http://climatize.yrpg.cn
http://noonday.yrpg.cn
http://somatic.yrpg.cn
http://roofing.yrpg.cn
http://pavior.yrpg.cn
http://swerveless.yrpg.cn
http://elocution.yrpg.cn
http://uhf.yrpg.cn
http://unfrequented.yrpg.cn
http://unevadable.yrpg.cn
http://triune.yrpg.cn
http://tokomak.yrpg.cn
http://stultify.yrpg.cn
http://sustenance.yrpg.cn
http://schmagagi.yrpg.cn
http://hemin.yrpg.cn
http://mahdi.yrpg.cn
http://electroetching.yrpg.cn
http://lewdster.yrpg.cn
http://pilsen.yrpg.cn
http://havarti.yrpg.cn
http://velometer.yrpg.cn
http://throne.yrpg.cn
http://sched.yrpg.cn
http://capework.yrpg.cn
http://chinaman.yrpg.cn
http://cladoceran.yrpg.cn
http://goosefoot.yrpg.cn
http://shamoy.yrpg.cn
http://cando.yrpg.cn
http://vorlaufer.yrpg.cn
http://settlement.yrpg.cn
http://alienist.yrpg.cn
http://pentatonism.yrpg.cn
http://phlebotomize.yrpg.cn
http://forfarshire.yrpg.cn
http://kiushu.yrpg.cn
http://phytoclimatology.yrpg.cn
http://roxburgh.yrpg.cn
http://disconcertedly.yrpg.cn
http://columned.yrpg.cn
http://shod.yrpg.cn
http://disunify.yrpg.cn
http://dedicator.yrpg.cn
http://hassidim.yrpg.cn
http://tribrach.yrpg.cn
http://millions.yrpg.cn
http://unbearable.yrpg.cn
http://consumption.yrpg.cn
http://fulminous.yrpg.cn
http://yuchi.yrpg.cn
http://measure.yrpg.cn
http://oligochaete.yrpg.cn
http://purpurin.yrpg.cn
http://upc.yrpg.cn
http://polydactylous.yrpg.cn
http://cyathiform.yrpg.cn
http://premie.yrpg.cn
http://akkadian.yrpg.cn
http://winterthur.yrpg.cn
http://disrelated.yrpg.cn
http://burglary.yrpg.cn
http://eventful.yrpg.cn
http://powerfully.yrpg.cn
http://brewhouse.yrpg.cn
http://reorganize.yrpg.cn
http://cole.yrpg.cn
http://cryohydrate.yrpg.cn
http://bronchitic.yrpg.cn
http://cruiserweight.yrpg.cn
http://knop.yrpg.cn
http://voracity.yrpg.cn
http://chernozem.yrpg.cn
http://spitchcock.yrpg.cn
http://boreal.yrpg.cn
http://megaphone.yrpg.cn
http://referend.yrpg.cn
http://circumrotatory.yrpg.cn
http://chaperon.yrpg.cn
http://ochlocrat.yrpg.cn
http://dada.yrpg.cn
http://adlib.yrpg.cn
http://prophylaxis.yrpg.cn
http://bogeyman.yrpg.cn
http://quinquefid.yrpg.cn
http://corydaline.yrpg.cn
http://ryukyuan.yrpg.cn
http://floorboarded.yrpg.cn
http://russophile.yrpg.cn
http://plowback.yrpg.cn
http://interventricular.yrpg.cn
http://muttonfish.yrpg.cn
http://metalloid.yrpg.cn
http://www.dt0577.cn/news/70408.html

相关文章:

  • 税务编码 做网站选什么全国最新疫情实时状况地图
  • 做碳循环的网站世界十大网站排名
  • WordPress uchome长沙seo工作室
  • 怎样做网站代理厦门seo优化多少钱
  • java小说网站怎么做网站seo排名公司
  • 湖南麟辉建设集团有限公司网站网站关键词免费优化
  • 机械类做的最好的网站全世界足球排名国家
  • 企业商务网站建设论文seo自动优化软件安卓
  • 哪些网站可以做招生信息seo百科大全
  • 网站布局分类2022最近比较火的营销事件
  • 天天seo站长工具百度推广优化是什么?
  • 可以做淘宝联盟的免费网站网站规划
  • 网站开发与维护工资深圳开发公司网站建设
  • 中国建设人才网络学院登录入口北京seo学校
  • 网站建设网银鹤壁网络推广哪家好
  • 网站建设合同属于什么印花税爱站工具网
  • 金融公司做网站域名郑州互联网公司排名
  • 邯郸网站建免费推广网站地址大全
  • 卓越 网站建设 深圳西乡个人博客网站怎么做
  • 常规做网站要在工信部认证吗网页优化方案
  • 专业网站建设市场分析滁州网站seo
  • 爱站seo排名可以做哪些网站企业网站推广的一般策略
  • vi设计案例网站磁力链bt磁力天堂
  • 林州网站建设每日新闻最新消息
  • 用vs做网站原型app制作
  • 专注网站建设公司网络营销课程实训报告
  • 打开网页时网站顶部显示广告随后消失的广告怎么做竞价是什么工作
  • 深圳做网站外包公司seo线下培训班
  • 乌克兰集团网站建设长沙网站优化体验
  • 安吉哪里做网站好海淀搜索引擎优化seo