《数据库原理》实验报告DB7——事务与并发控制
一. 实验内容、步骤以及结果
假设学校允许学生将银行卡和校园卡进行绑定,在student数据库中有如下的基本表,其中校园卡编号cardid即为学生的学号:
icbc_card(studcardid, icbcid, balance) //校园卡ID,工行卡ID,银行卡余额
campus_card(studcardid, balance) //校园卡ID,校园卡余额
本实验中的部分示例数据
create table icbc_card(
icbcid int,
sno varchar(8),
balance int
);
create table campus_card(
sno varchar(8),
balance int
);
insert into campus_card values ('20200032', 1);
insert into campus_card values ('20200033', 100);
insert into icbc_card values (1, '20200032', 300);insert into icbc_card values (2, '20200033', 400);
针对以上数据库按照要求完成下列实验:
1. 编写一个事务处理实现如下的操作:某学号为20200032的学生从银行卡中转账200元到校园卡中,若中间出现故障则进行rollback。(10分)
DELIMITER $$
USE `student`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `zhuanzhang`()
BEGINdeclare bank_card_balance int default 0;select balance from icbc_card where sno = '20200032' into @bank_card_balance;if @bank_card_balance>200 thenupdate icbc_card set balance = balance + 400 where sno = '20200032';update campus_card set balance = balance + 200 where sno = '20200032';commit;elserollback;end if;
END$$Call zhuanzhang;
可以看到学号为20200032的学生银行卡账户少了200,且对应的校园卡账户增加了200.
2. 针对本题的数据库和表,分别用具体的例子展现几种数据不一致问题:如丢失修改、读脏数据、不可重复读和幻读(删除和插入),注意如有无法展现的情况,请说明原因。(20分,每种数据不一致10分)
(1) 丢失修改
此时隔离级别为repeatable-read
(2) 读脏数据
此时隔离级别为read-uncommitted
(3) 不可重复读
此时隔离级别为read-committed
(4) 幻读(删除和插入)
此时隔离级别为read-committed
3. 利用数据库的隔离级别或者锁机制等,设计方案分别解决上述丢失修改、读脏数据、不可重复读、幻读的数据不一致问题。(20分,每种数据不一致5分)
(1) 丢失修改
set transaction isolation level serializable;
show variables like 'transaction_isolation';
此时隔离级别为repeatable-read
(2) 读脏数据
set transaction isolation level read-commited;
show variables like 'transaction_isolation';
此时隔离级别为read-committed
(3) 不可重复读
此时隔离级别为repeatable-read
(4) 幻读(删除和插入)
此时隔离级别为repeatable-read
4. 构造两个事务同时更新一条数据,尝试使用以下SQL命令查看和理解当前系统中事务以及锁的状态等信息。(10分)
show engine innodb status (MySQL 8.0 or 5.7)select * from information_schema.innodb_trx (MySQL 8.0 or 5.7)select * from performance_schema.data_locks; (MySQL 8.0)select * from sys.innodb_lock_waits; (MySQL 8.0)select * from information_schema.innodb_lock_waits (MySQL 5.7)select * from information_schema.innodb_locks (MySQL 5.7)
5. 构造一个出现死锁的情形。(10分)
6. 构造含有savepoint的事物,并在某时刻回滚到某个savepoint。(10分)
start transaction;
insert into icbc_card values(1,'20200034',200);
insert into icbc_card values(2,'20200035',500);
savepoint s1;
insert into icbc_card values(3,'20200036',200);
insert into icbc_card values(4,'20200037',500);
savepoint s2;
insert into icbc_card values(5,'20200038',200);
insert into icbc_card values(6,'20200039',500);
select * from icbc_card;
完成所有的插入icbc_card中的数据:
rollback to savepoint s2;
select * from icbc_card;
回滚到s2后icbc_card中的数据:
rollback to savepoint s1;
select * from icbc_card;
回滚到s1后icbc_card中的数据:
rollback;
select * from icbc_card;
回滚所有的后icbc_card中的数据:
7. 通过实验查看mysql中的各种日志:查询日志、错误日志、慢查询日志。(10分)
1) 查询日志:
默认关闭,需要自行打开
Set global general_log = on;
Show variables like ‘%general_log%’
2) 错误日志:
错误日志的位置在C:\ProgramData\MySQL\MySQL Server 8.0\Data,默认以 $HOSTNAME.err 为文件名称。
3) 慢查询日志:
错误日志的位置在C:\ProgramData\MySQL\MySQL Server 8.0\Data,默认以 $HOSTNAME-slow.log 为文件名称。
8. 用mysqlbinlog查看数据库的事务日志,并尝试按照以下场景进行数据恢复。(10分)
操作步骤:
1)建立db1,建立t1、t2表。t1、t2表结构:create table t1(id int);
2)向t1插入数据:11,12, 13 3)向t2插入数据:21, 22, 23
3)drop table t1;
4)t2还可以正常使用,给t2插入数据24
在以上第4步的操作之后,利用mysqlbinlog恢复t1的数据。
以上4个步骤的SQL如下:
create database db1;create table t1(id int);create table t2(id int);insert into t1 values(11);insert into t1 values(12);insert into t1 values(13);insert into t2 values(21);insert into t2 values(22);insert into t2 values(23);drop table t1;insert into t2 values(24);
- 首先创建新的binlog日志文件
flush logs;
show master status;
然后执行上方的代码
然后查看binlog文件
show binlog events in 'DESKTOP-LMI9M9U-bin.000012';
可以看到start position = 156,stop position = 1278
- 使用命令行工具将binlog文件中的sql语句导出(需要使用管理员权限)
mysqlbinlog --start-position=156 --stop-position=1278 DESKTOP-LMI9M9U-bin.000012>C:\test000022.sql
- 导入sql文件
经查询,已恢复
二. 实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)
在备份数据库时出现了命令行中无法实施mysqlbinlog工具,最后将环境变量进行添加,并且使用管理员权限打开cmd后成功运行,得以完成实验。
《数据库原理》实验报告DB7——事务与并发控制相关推荐
- 【数据库原理实验(openGauss)】事务与并发控制
事务与并发控制 文章目录 事务与并发控制 一.事务 (1)事务的ACID特性 (2)事务管理 (3)事务实例 1.未提交的事务 2.已提交的事务 二.并发控制 (1)加锁语法 (2)加锁实例 一.事务 ...
- mysql的触发器实验报告_数据库原理实验报告s11-数据库触发器的创建.doc
数据库原理实验报告s11-数据库触发器的创建.doc 数据库管理系统SQLSERVER实验报告第1页2011年5月4日实验11数据库触发器的建立实验日期和时间20141128实验室软件工程室班级12计 ...
- mysql数据库原理实验报告_数据库原理实验报告(Mysql).doc
数据库原理实验报告(Mysql).doc 实验项目列表 序号实验项目名称指导教师1实验一 数据库的定义实验(验证性)2实验二 数据库的建立和维护实验(验证性)3实验三 数据库的查询实验(验证性)4实验 ...
- 数据库原理实验报告【全集】
如果对你有帮助,记得点赞哦! 实验1~8:SQL Server 2008的安装及管理工具的使用.SQL Server数据库的管理.SQL Server数据表的管理.数据查询.索引和视图.数据完整性.T ...
- 数据库原理实验报告5
接上次的实验,本次主要练习数据查询由于上次做的比较多,所以本次实验的一些题目在上一次实验报告就已经发布了 首先这次实验是本学期第一次在学校机房做,开始不太习惯,导致有一些截图不是很完整,好在最终还是明 ...
- mysql数据完整性实验报告,数据库原理实验报告(Mysql)
图5 course表 图6 sc表 图7 course的约束条件 图8 sc的约束条件 3.利用命令方式建表: (1).单击"查询",然后点击"新建查询",在弹 ...
- 数据库原理实验报告(一)
答案在后面 一.在studentdb中创建架构Production和Person并比较区别. create schema Production --架构命名不能以数字开头 create schema ...
- 【数据库原理实验(openGauss)】实验报告
<数据库系统原理实验>报告 文章目录 <数据库系统原理实验>报告 一.实验课程性质和教学目标 二.实验课程教学基本要求 三.实验教学内容 实验一 认识DBMS系统 (一)实验目 ...
- 数据库原理实验二 数据库管理 实验报告
广州大学学生实验报告实验二:数据库管理 此篇分享仅供参考学习,图文禁复制,勿作他用!谢谢配合! 数据库原理实验之实验二:数据库管理 软件:Oracle SQL Developer 今天实验才刚开始,花 ...
最新文章
- IOS开发笔记3-C语言基础复习
- ​每日一皮:​入职新公司第一周的感受...
- Python语言编程之LEGB变量作用域法则
- Codeforces-712C-Memory and De-Evolution
- BZOJ2809 dispatching 【可并堆】
- keyloadtool_phoenix 利用CsvBulkLoadTool 批量带入数据并自动创建索引
- OSChina 周日乱弹 —— 七哥的北漂日记
- Fastlane为iOS带来持续部署
- db2存储过程手动执行没有问题_轻松解决DB2创建存储过程时遇到的错误
- 计算机三级之嵌入式系统学习笔记7
- java 类继承命名_Java 语言的类间的继承关系是( )。_学小易找答案
- qmainwindow 标题栏_QMainWindow菜单栏和工具栏
- HDU2109 Fighting for HDU【排序】
- wordpress导入数据错误MySQL返回:#1273 – Unknown collation:’utf8mb4_unicode_ci’
- 学习Java开源框架前你应该了解的
- 吴恩达深度学习课后作业-目标检测的环境配置
- SpringBoot构建电商基础秒杀项目
- JWT 的退出登录方法
- 支付宝支付 接口配置
- struts2类型转换和验证
热门文章
- WinXPSP2:IE浏览器加载项管理(转)
- Lua和Luajit的优势和不足(1)
- 二维码的识别过程以及柱体二维码的实际应用情况调研报告
- Android菜鸡的提升之路---自闭症儿童游戏的实现
- RoadFlow项目架构分析
- 实习广场投递简历分析
- 计算机系双选会方案,【毕业生双选会筹备方案12篇】_毕业生双选会筹备方案范文大全_2021年毕业生双选会筹备方案_东城教研...
- 视频教程-Web前端从初级到高手之路-其他
- Jquery简单实现2048小游戏
- 百度地图获取行政范围边界