SQL并发控制总结 - sql server 2012数据库基础-并发控制-实验报告

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: SQL并发控制总结 - sql server 2012数据库基础-并发控制-实验报告

这是大三第一学期《数据库基础》的实验报告,总共15个实验,前12个百度文库都有,后面三个网上找不到都是我自己花了很多时间琢磨出来的,希望对大家,以及将来的我有所帮助!

了解四种异常事务状态(分别是脏读、不可重复读、丢失更新、死锁),理解发生异常事务状态的原理,以及我们要则么通过增加事务隔离级别来封锁,实现并发控制。当然随着事务隔离级别提升,所消耗的资源也变多,所以要根据实际情况选择隔离级别,也要预防死锁现象的发生。

当然sql server 2012版本自带预防机制,所以导致部分实验没法做,重点是理解异常产生的原理,以及如何防止异常的发生。


全部总结链接

SQL基础   (数据库、表、数据的增删改查、视图相关,以及所有实验报告源代码)

游标 (类似C++ 的 指针)

存储过程(类似 C++ 的自定义函数)

触发器 (类似 自定义的陷阱,或者说是监听器,满足某个条件了执行某个方法)

用户权限及权限管理 (类似Windows的多用户管理)

并发控制 (了解多个用户同时对数据造成错误的情况 和 解决方法)

数据恢复(当数据库数据丢失,相应的解决方法)

课程名称  数据库基础            

实验项目   实验14 并发控制      


实验要求:

  1. 独立完成本实验,以多个用户身份登录,创建管理多个事务。
  2. 设计一组操作产生“脏”读问题,然后通过封锁避免“脏”读问题。
  3. 设计一组操作产生不可重复读问题,然后通过封锁避免不可重复读问题。
  4. 设计一组操作产生丢失更新问题,然后通过封锁避免丢失更新问题。
  5. 设计一组产生死锁的操作,再利用相同顺序法有效的避免死锁。
  6. 在实验报告中要给出具体的操作步骤和过程,并针对各种情况做出具体的分析和讨论,很好的体会事务的性质和并发控制的作用。

实验过程

第一题:设计一组操作产生“脏”读问题,然后通过封锁避免“脏”读问题。

1.1概念:我个人觉得脏读就是A事务读到了B事务未提交的数据。(A事务修改数据1后,B事务读取了当前的数据1,然后A因为某种错误回档,导致B事务读取的数据错误)。通俗来说就是A事务放了B事务的鸽子。

1.2整体思路:

先运行一个事务A (  1.修改课程学时数据为8 ; 2.等待20秒 ; 3.回滚数据,学时还原为6 ),在事务A的第二步等待的时候,运行事务B (  1.查询学时; 2. 等待20秒; 3. 查询学时)。其中事务B第一次查询是事务A中间的等待期,所以学时为8,第二次查询在事务A结束后,所以学时为6.

1.3 代码截图:

首先我们在第一个查询页面运行以下代码:

图 1  查询窗口1  先更新学时为‘8 ’ 后回滚

代码解析:

以上第一行代码为:事务zwz1的开始标志

第二行代码:更新课程表中课程编号为1128的学时为8

第三行代码:等待20秒延迟

第四行代码:回滚第二行代码,恢复到该事务未执行的状态

第五行代码:查询课程表中课程编号为1128的所有信息

 

接下来在查询窗口2,执行以下代码:

图 2  查询窗口2  分别在事务A 等待期 和 结束后 查询学时

 

代码解析:

以上第一行代码为:在无锁的情况下查询课程表中课程编号为1128的所有信息(为错误信息)

第二行代码:等待20秒的时间

第三行代码:再次查询,发现数据不一致(本次为正确信息)

 

接下来是加封锁的情况:

图 3  加了写读锁后(不加也一样),窗口1回滚后 学时还是6 不变

 

注:和前面不加封锁对比,多了第一行代码,即加上一个“写读锁”,个人理解为“当事务A想读取某数据,必须要等当前其他事务修改完,才能读

 

图 4  加了写读锁之后 事务B等事务A全部执行完毕后再执行 所以结果都是6

 

注:窗口二和前面不加封锁相比,也是多了第一行代码,运行的时候能明显感觉到运行了40秒,即等窗口1执行完毕后再执行窗口2的事务。


第二题:设计一组操作产生不可重复读问题,然后通过封锁避免不可重复读问题。

2.1 概念:事务A读某数据后,事务B将其修改,然后事务A再次读数据和之前的不一样。通俗理解为被调包。

2.2 总体思路:事务A读取1128号课程数据后,等待5秒,然后事务A再次读取该课程数据。其中事务B利用事务A的等待期,对该课程数据进行修改。

2.3代码截图:

图 5 事务A三部曲:读取数据 ;等待期 ; 读取数据 。发现数据不一致

 

图 6  事务B 在事务A等待期内 对数据进行修改

解决方案:设置隔离级别 :repeatable read(可重复读)  书本179页

思路:在原有基础上 增加封锁

图 7 事务A执行过程中 事务B无法插入 所以前后查询结果一致

 

图 8  事务B只能在事务A执行完毕后再执行 修改成功

 

图 9  事务B执行后 学时数据被修改


第三题:设计一组操作产生丢失更新问题,然后通过封锁避免丢失更新问题。

 

3.1概念:丢失更新我个人理解为事务A和事务B同时对该数据进行修改,假设事务A执行时间短,事务B执行时间长,那么事务B会覆盖事务A的修改结果。(换一种方式的放鸽子)

但是在SQL Server 2012中,不管是同一用户还是不同用户,都自带锁,即都是在先执行的事务执行完毕后,再执行另一个事务。

 

3.2总体思路 :

事务A先对学时数据查询(原先为6)再对学时进行修改(修改为8)最后5秒等待期再次查询(结果为8)

事务B在事务A的等待期内开始执行(结果是等事务A结束再执行的),也先对学时数据查询(原先为6)再对学时进行修改(修改为10)最后5秒等待期再次查询(结果为10)

结果为事务B覆盖了事务A的更新,可我觉得这只是因为事务B比事务A晚执行的原因

3.3 代码截图:

图 10 刚开始 学时数据为 6

 

先执行事务A,紧接着执行事务B(相当于在事务A的等待期内执行)

图 11 可以视为 同时执行事务A和事务B

 

观察事务A 、事务B的执行结果:

图 12 事务A执行前数据为6  执行后数据为8

 

图 13 事务B执行前数据为8  执行后数据为10 说明和事务A互不干扰

这时候我们可以发现,事务B在事务A全部完成之后再执行,对事务A互不干扰 ,最后查看数据库中的数据为10.

图 14 数据库 课程表中的数据


第四题:设计一组产生死锁的操作,再利用相同顺序法有效的避免死锁。

 

4.1 概念 :就是你等我,我等你,导致互相一直等下去,卡死循环

4.2整体思路:

同样 sql server 2012也自带对死锁的预防,实验如下:

我先执行查询1(操作1,等待5秒,操作2),然后马上执行查询2(操作2,等待5秒,操作1),因为执行中间有五秒等待时间,查询1的第二个更新等待查询2执行完毕,查询2的第二个更新等待查询1执行完毕,构成死锁。

不过大概10秒钟之后,sql server 2012自动解开了死锁,即查询2做出让步,查询1全部执行。( &^^^& 太智能了)

 

4.3代码截图:

图 15 事务A被事务B让步 成功执行

 

图 16  事务B为了让步事务A,成为牺牲品,后半段执行失败

 

然后使用相同顺序法调换顺序之后:

图 17  事务A正常执行

 

图 18 事务B正常执行

即没有死循环,正常运行。


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
16天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
88 6
|
3天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
5天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
11天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
25 0
|
12天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
12天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
39 3
|
15天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
52 0
|
8天前
|
关系型数据库 MySQL 分布式数据库
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
45 2
|
24天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
105 0
|
24天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)

热门文章

最新文章