前端喵前端喵
  • 🎹leetcode算法
  • 🌲后台管理项目
  • 🍎八股文
GithHub
  • 🎹leetcode算法
  • 🌲后台管理项目
  • 🍎八股文
GithHub
  • 首页
  • 系统笔记

    • leetcode算法笔记大全
    • 前端八股文笔记大全
    • 后台管理项目0-1搭建笔记
    • 后台管理项目脚手架0-1搭建笔记
  • 技术文章

    • 常见的性能优化手段
    • 如何修改gitignore并删除远程的ignore文件
    • 如何给GitHub项目提交pr
    • 小米android前端面试全流程
    • git操作指南
    • Promise面试题
    • 如何混合使用commonjs和esm
    • 模拟面试项目拷打1
    • 项目综合模拟面试
    • 如何注册和使用域名
    • git commit提交规范
    • Mysql的并发控制实验

Mysql的并发控制实验

  1. 使⽤studentdb数据库中的student_info表格。 (1)打开MySQL客户机A,对student_info表格施加表级共享锁后查看该表格。
USE studentsdb;
LOCK TABLES student_info READ;
SELECT * FROM student_info;

alt text

(2)在MySQL客户机A上尝试向student_info表格添加⼀条记录,学号0009,姓名王昕悦,性别⼥,出⽣⽇ 期1999-03-27,家庭住址北河市⼈⺠路32号,备注为空。能否成功?为什么?

INSERT INTO student_info 
VALUES ('0009', '王昕悦', '女', '1999-03-27', '北河市人民路32号', NULL);

alt text 不能成功,因为表级共享锁阻止了写操作。

(3)打开MySQL客户机B,对student_info表格施加表级共享锁后查看该表格。该操作能否成功?为什么?

USE studentsdb;
LOCK TABLES student_info READ;
SELECT * FROM student_info;

alt text 可以操作成功,多个客户机可以对同一个表添加共享锁

(4)在MySQL客户机B上解除步骤(3)上的共享锁,并试图在student_info表格上施加表级排它锁。该操作 能否成功?为什么?

UNLOCK TABLES;
#获取排它锁
LOCK TABLES student_info WRITE;

alt textalt text 排他锁一直没有执行成功,因为客户机A已经对student_info表加了共享锁,所以客户机B无法对student_info表加排它锁。 (5)切换⾄客户机A,解除表格上的共享锁。 alt text (6)切换⾄客户机B,在表格上成功上了排它锁后添加步骤(2)中的记录,成功后解除该写锁。 alt textalt textalt text

  1. 使⽤studentdb数据库。 (1)打开客户机A,开始事务,对grade表格中所有课程编号为0003的记录上⾏级写锁。
START TRANSACTION;
SELECT * FROM grade 
WHERE 学号 = '0003' 
FOR UPDATE;

alt text

(2)打开客户机B,开始事务,尝试对grade表格中学号为0001的记录上⾏级共享锁,能否成功?为什么?

START TRANSACTION;
SELECT * FROM grade 
WHERE 学号 = '0001' 
LOCK IN SHARE MODE;

alt text 成功,因为这是行级锁,可以同时对多行记录上锁。

(3)使⽤客户机B,开始事务,尝试对grade表格上表级共享锁,能否成功?为什么?

LOCK TABLES grade READ;

alt text 不成功,当一个事务对表的部分记录持有写锁时,其他事务不能对整个表施加共享锁

(4)切换⾄客户机A,更新记录使得学号为0005的学⽣,课程编号0003的分数为85;计算此时课程编号为 0003的分数平均分;提交事务。

UPDATE grade 
SET 分数 = 85 
WHERE 学号 = '0005' AND 课程编号 = '0003';

SELECT AVG(分数) 
FROM grade 
WHERE 课程编号 = '0003';

COMMIT;

alt text 事务提交(COMMIT)意味着释放了之前的所有锁

(5)切换⾄客户机B,开启事务,确保grade表格上有了表级共享锁后,通过grade表格查看课程编号为0001 的课程的最⾼分和最低分,再解除对grade表格的共享锁。

SELECT MAX(分数),MIN(分数) FROM grade 
WHERE 课程编号 = '0001';

UNLOCK TABLES;
COMMIT;

alt text

(6)使⽤客户机B,对curriculum表格施加表级共享锁,并查看该表格,之后解除共享锁,并提交事务。

LOCK TABLES curriculum READ;
SELECT * FROM curriculum;
UNLOCK TABLES;
COMMIT;

alt text

(7)在上述(1)-(6)的步骤中,遵守的是⼏级封锁协议?它能够防⽌哪些并发问题?这些步骤是否遵守两 段封锁协议?

封锁级别:

这些步骤遵守的是两阶段锁协议(Two-Phase Locking, 2PL)。

具体特征:

第一阶段(扩展阶段):只允许获取锁,不允许释放锁
第二阶段(收缩阶段):只允许释放锁,不允许获取新锁

防止的并发问题:

防止脏读(读取未提交的数据)
防止不可重复读(同一事务中多次读取数据结果不同)
防止幻读(事务执行过程中,另一事务插入了影响结果的新记录)

两段锁协议的特点:

事务中的所有加锁操作必须在解锁操作之前完成
确保了事务的隔离性
可以防止大多数并发事务带来的数据一致性问题

是否严格遵守两段锁协议:

是的,每个事务都遵守了两段锁协议,先进行锁的获取(扩展阶段),后进行锁的释放(收缩阶段),没有出现在释放锁后又获取新锁的情况

通过这种锁的使用方式,可以有效地控制并发事务,保证数据的一致性和隔离性。

Last Updated:
Contributors: namewyf
Prev
git commit提交规范