数据库第五次实验报告
- 格式:pdf
- 大小:800.99 KB
- 文档页数:13
南昌航空大学实验报告二0一年月日课程名称:数据库原理实验名称:数据库的并发控制与恢复备份班级:姓名:同组人:指导教师评定:签名:一、实验环境1、Windows2000或以上版本;2、SQLServer2000或2005。
二、实验目的1.掌握数据库并发控制与恢复备份基础知识;2.掌握创建、修改、使用、数据库并发控制与恢复的不同方法。
三、实验步骤及参考源代码实验一:数据库并发控制1、丢失数据create table sales(客户代号char(5)primary key,数量int null)insert into sales values('A0001',0)create procedure modi_a asdeclare @i intdeclare @s1 intset transaction isolation level read committed select @i=1while(@i<=2000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1+1 where客户代号='A0001'commit transelect @i=@i+1endcreate procedure modi_m asdeclare @i intdeclare @s1 intset transaction isolation level read committed select @i=1while(@i<=2000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1-1 where客户代号='A0001'commit transelect @i=@i+1end同时运行存储过程modi_a和modi_m可以看到如下结果:本应该数量一栏应该是0的,说明数据发生了丢失数据。
数据库系统概论实验报告(五)姓名:田垒班级学号: 2010080405226学院:信息学院专业:计算机科学与技术2010年12月12日实验五、用户自定义函数一、实验目的学习、掌握用户自定义函数的建立和使用二、实验平台操作系统:Windows 2000或者Windows XP。
数据库管理系统:Microsoft SQL Server 2000 或Microsoft SQL Server 2005。
三、实验内容1、创建自定义函数创建一个用户自定义函数,并测试、查看函数返回值。
USE NorthwindGOCREATE FUNCTION fn_TaxRate(@ProdID INT)RETURNS numeric(5,4)ASBEGINRETURN(SELECTCASE CategoryIDWHEN 1 THEN 1.10WHEN 2 THEN 1WHEN 3 THEN 1.10WHEN 4 THEN 1.05WHEN 5 THEN 1WHEN 6 THEN 1.05WHEN 7 THEN 1WHEN 8 THEN 1.05ENDFROM ProductsWHERE ProductID = @ProdID)ENDGOSELECT ProductName, UnitPrice,Northwind.dbo.fn_TaxRate(ProductID) AS TaxRate,UnitPrice * Northwind.dbo.fn_TaxRate(ProductID) AS PriceWithTax FROM Products结果:注意:函数可以在Select子句后面调用。
2、返回值为多值的自定义函数创建函数返回多列多值。
USE NorthwindGOCREATE FUNCTION fn_LargeFreight(@FreightAmt money)RETURNS TABLEASRETURN( SELECT S.ShipperID, panyName,O.OrderID, O.ShippedDate, O.FreightFROM Shippers AS S JOIN Orders AS OON S.ShipperID = O.ShipViaWHERE O.Freight > @FreightAmt)SELECT * FROM fn_LargeFreight(600)结果:3、返回值为多值的自定义函数本实验创建的函数也是返回多列多值,注意与上面实验的差别。
数据库基础与实践实验报告实验五存储过程和触发器班级:惠普测试142学号:**********姓名:***日期:2016-11-141 实验目的:1)掌握SQL进行存储过程创建和调用的方法;2)掌握SQL进行触发器定义的方法,理解触发器的工作原理;3)掌握触发器禁用和重新启用的方法。
2 实验平台:操作系统:Windows xp。
实验环境:SQL Server 2000以上版本。
3 实验内容与步骤利用实验一创建的sch_id数据库完成下列实验内容。
1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。
存储过程定义代码:CREATE PROCEDURE JSXX_PROCASSELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND o=o存储过程执行语句与执行结果截图:EXECUTE JSXX_PROC2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。
存储过程定义代码:CREATE PROCEDURE XM_PROC @sname VARCHAR(100)ASBEGINIF EXISTS(SELECT NULL FROM S WHERE sn=@sname)SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE o=o AND SC.sno=S.sno ANDS.sn=@snameELSEPRINT'无该姓名的同学。
'END运行截图:3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业),统计并显示该专业各年龄段男、女生人数。
如果没有该专业,则显示“无此专业”。
存储过程定义代码:CREATE PROCEDURE XBNL_PROC@departName VARCHAR(30)='计算机',@begin INT,@end INTASDECLARE @numOfBoys INTDECLARE @numOfGirls INTDECLARE @d# VARCHAR(3)DECLARE @result VARCHAR(50)BEGINSELECT @d# = dno FROM D WHERE dn=@departNameIF @d# IS NOT NULLBEGINSELECT @numOfBoys =COUNT(sno)FROM S WHERE age BETWEEN @begin AND @end AND dno=@d# AND sex='男'SELECT@numOfGirls =COUNT(sno)FROM S WHERE age BETWEEN@begin AND@end AND dno=@d# AND sex='女'SET @result = @departName+'专业年龄在'+CAST(@begin AS VARCHAR(3))+'-'+CAST(@end AS VARCHAR(3))+'之间的男生有'+CAST(@numOfBoys AS VARCHAR(3))+'人,'+'女生有'+CAST(@numOfGirls AS VARCHAR(3))+'人'ENDELSESET @result='无此专业。
《数据库原理与应用》实验报告实验名称:存储过程与触发器班级:学号:姓名:一、实验目的(1)掌握Oracle数据库编程语言PL/SQL的基础知识。
(2)掌握游标、存储过程和触发器的创建,使用方法。
(3)了解使用高级语言连接数据库的技术、基本方法,了解ODBC、ADO和JDBC 的技术。
二、实验过程在实验一、实验二创建的表中用PL/SQL语言完成以下内容:1.创建存储过程,根据调用时提供的学生姓名查询该学生所修课程的课程信息,在过程体中将课程号、课程名和成绩输出到输出窗口,在SQL窗口中给出过程调用语句块。
语句:create or replace procedure p1(v_sname in s.sname%type) isa o%type;b ame%type;cursor c1 isselect o,amefrom course,scwhere o=o and sno=(select snofrom studentwhere sname=v_sname);beginopen c1;loopfetch c1 into a,b;exit when c1%notfound;dbms_output.put_line(a||' '||b);end loop;close c1;end;beginp1('张北辰');end;执行结果:2.(1)删除SPJ关系中所有数据。
语句:delete from spj;执行结果:(2)在插入和修改SPJ表中QTY属性列的值时用触发器实现约束:如果是北京的供应商,供应任何零件的数量不能少于300,如果少于则自动改为300。
语句:create or replace trigger tr1before insert or update on spjfor each rowdeclarev_citys.city%type;beginselect cityinto v_cityfrom swhere sno=:new.sno;if(v_city='北京' and :new.qty<300)then :new.qty:=300;end if;end tr1;执行结果:(3)在SPJ表中录入值进行验证。
数据库实验报告五一、实验目的本次数据库实验的目的在于深入了解和掌握数据库的相关操作和应用,通过实际操作提高对数据库原理的理解和运用能力,培养解决实际问题的思维和方法。
二、实验环境本次实验使用的数据库管理系统为_____,操作系统为_____,实验所使用的计算机配置为_____。
三、实验内容1、数据库的创建使用相应的命令和工具创建了一个名为_____的数据库,并设置了合适的字符集和校对规则,以满足数据存储和处理的需求。
2、表的设计与创建在创建的数据库中,设计并创建了多个表,包括_____表、_____表和_____表等。
在表的设计过程中,仔细考虑了字段的数据类型、长度、是否允许为空等属性,以确保数据的完整性和准确性。
例如,在_____表中,设置了_____字段为整数类型,用于存储_____信息;_____字段为字符串类型,长度为_____,用于存储_____信息。
同时,为了保证数据的一致性,设置了主键和外键约束。
3、数据的插入通过编写 SQL 语句,向创建的表中插入了大量的测试数据。
在数据插入过程中,注意了数据的合法性和有效性,避免了插入错误或不完整的数据。
4、数据的查询使用各种查询语句对插入的数据进行查询操作,包括简单查询、条件查询、连接查询、分组查询和排序查询等。
通过这些查询操作,熟练掌握了 SQL 语言中查询语句的语法和用法,能够根据不同的需求准确地获取所需的数据。
例如,使用简单查询语句获取了_____表中所有的记录;使用条件查询语句获取了满足特定条件(如_____)的记录;使用连接查询语句将多个表中的相关数据进行关联查询,获取了更全面的信息。
5、数据的更新与删除对表中的数据进行了更新和删除操作,以模拟实际应用中的数据修改和清理需求。
在更新和删除数据时,特别注意了操作的条件和范围,避免了误操作导致数据的丢失或错误。
四、实验中遇到的问题及解决方法1、数据类型不匹配问题在插入数据时,由于对某些字段的数据类型理解不准确,导致出现数据类型不匹配的错误。
实验五:数据库综合查询一、实验目的1.掌握SELECT语句的基本语法和查询条件表示方法;2.掌握查询条件种类和表示方法;3.掌握连接查询的表示及使用;4.掌握嵌套查询的表示及使用;5.了解集合查询的表示及使用。
二、实验环境已安装SQL Server企业版的计算机(120台);具有局域网环境,有固定IP;三、实验学时2学时四、实验要求1.了解SELECT语句的基本语法格式和执行方法;2.了解连接查询的表示及使用;3.了解嵌套查询的表示及使用;4.了解集合查询的表示及使用;5.完成实验报告;五、实验内容及步骤1.利用Transact-SQL嵌套语句实现下列数据查询操作。
1) 查询选修了计算机体系结构的学生的基本信息。
select*from studentwhere Sno in(select Sno from coursewhere Cno in(select Cno from sc where Cname='计算机体系结构'))2) 查询年龄比李勇小的学生的学号和成绩。
select a.sno,grade from student a,coursewhere a.sno=course.sno and sage<(select sage from student where sname='李勇')3) 查询其他系中比系编号为‘D1’的学生中年龄最小者要大的学生的信息。
select*from student where dnum<>'D1'AND SAGE>(select min(sage)from student where dnum='D1')4) 查询其他系中比系编号为‘D3’的学生年龄都大的学生的姓名。
select*from student where dnum<>'D3'AND SAGE>all(selectsage from student where dnum='D3')5) 查询‘C1’课程的成绩高于70的学生姓名。
数据库实验报告:实验五一、实验目的本次数据库实验五的主要目的是深入了解和掌握数据库的高级操作,包括存储过程的创建与使用、视图的定义和应用、以及事务处理的原理和实践。
通过这些实验内容,提高我们对数据库系统的综合运用能力,为解决实际的数据库管理问题打下坚实的基础。
二、实验环境本次实验使用的数据库管理系统是 MySQL 80,开发工具为 Navicat Premium 12。
操作系统为 Windows 10 专业版。
三、实验内容及步骤(一)存储过程的创建与使用1、创建一个名为`get_student_info` 的存储过程,用于根据学生学号查询学生的基本信息(包括学号、姓名、年龄、性别和专业)。
```sqlDELIMITER //CREATE PROCEDURE get_student_info(IN student_id INT)BEGINSELECT FROM students WHERE student_id = student_id;END //DELIMITER ;```2、调用上述存储过程,查询学号为 1001 的学生信息。
```sqlCALL get_student_info(1001);```(二)视图的定义和应用1、创建一个名为`student_grade_view` 的视图,用于显示学生的学号、姓名和平均成绩。
```sqlCREATE VIEW student_grade_view ASSELECT sstudent_id, sname, AVG(ggrade) AS average_gradeFROM students sJOIN grades g ON sstudent_id = gstudent_idGROUP BY sstudent_id, sname;```2、查询上述视图,获取所有学生的平均成绩信息。
```sqlSELECT FROM student_grade_view;```(三)事务处理1、开启一个事务,向学生表中插入一条新的学生记录(学号:1005,姓名:_____,年龄:20,性别:男,专业:计算机科学)。
《数据库原理与设计》实验报告12. 查询所有借了编号为 B02的图书的读者编号(Rno )和读者姓名(Rname )。
13. 查询比编号为B01的图书的价格低的图书的编号 (Bno )、书名(Btitle )和价格 (Bprice )。
14. 查询至少借阅了读者 R01借阅的全部书籍的读者编号 (Rno )和读者姓名(Rname )。
15. 查询数据库类图书和价格低于 50元的图书的信息。
三、实验过程或算法(源程序)针对数据库Library 实现下列查询语句:1.查询全体读者的姓名(Rn ame )、出生年份。
SQLQuery6.fql * (_FANCOMI\A»(51))* ______________ 日 use LibraryL select distinct Rnaire, Rage f TOIL R M 2der2□结果-J 消息 9e a B 9R 1 11921 2D202. 查询所有年龄在18~20岁(包括18岁和20岁)之间的读者姓名(Rname)及年龄(Rage)。
------------------ ■—1SQLQuery6.sql ■ (1-(FANC©MI\Ass (51)) ______________________3 use library3 select distincT;Rndir.e,. Rage frcir Reader2L where Rage >= 18 and Rage <= 203. 查询学历为研究生、本科的读者的编号(Rno)、姓名(Rname)和性别(Rsex)。
£QLQuery6.sql - (1-<FAIMCOMI\A» (51))□ use Libraryselect distinct Rnc^ Rname^ Rsex from ReaderZI where Reducacian - 「研究主'or Reducauion ■'北#斗"55女4. 查询所有姓林的且全名为2个汉字的读者的姓名(Rname)、性别(Rsex)和年龄(Rage)。
数据库实验报告(7个实验完整附截图)福建农林大学计算机与信息学院实验报告课程名称:数据库原理及应用姓名:系:计算机科学与技术专业:计算机科学与技术年级:2012 级学号:指导教师:陈长江2014 年5月18 日实验项目列表序号实验项目名称成绩指导教师1 实验一数据库的定义实验(验证性)2 实验二数据库的建立和维护实验(验证性)3 实验三数据库的查询实验(验证性)4 实验四数据库的视图操作实验(验证性)5 实验五触发器、存储过程操作实验(综合性)实验一:数据库的定义实验一、实验目的:1、理解MySQL Server 6.0 服务器的安装过程和方法;2、要求学生熟练掌握和使用SQL、T-SQL、SQL Server Enterpriser Manager Server 创建数据库、表、索引和修改表结构,并学会使用SQL Server Query Analyzer,接收T-SQL 语句和进行结果分析。
二、实验环境:硬件:PC机软件:Windows操作系统、MySQL Server 6.0 和Navicat for MySQL 9.0三、实验内容和原理:1、安装MySQL以及相应的GUI工具2、用SQL命令,建立学生-课程数据库基本表:学生Student(学号Sno,姓名Sname,年龄Sage,性别Ssex,所在系Sdept);课程Course(课程号Cno,课程名Cname,先行课Cpno,学分Ccredit);选课SC(学号Sno,课程号Cno,成绩Grade);要求:1) 用SQL命令建库、建表和建立表间联系。
2) 选择合适的数据类型。
3) 定义必要的索引、列级约束和表级约束.四、实验步骤:1、运行Navicat for MySQL,然后进行数据库连接,进入到GUI 界面;2、利用图形界面建立基础表:student 表的信息:字段名类型长度约束条件Sno varchar9非空、主键Sname varchar20Ssex varchar2Sage smallint 6Sdept varchar20course表的信息:字段名类型长度约束条件Cno varchar4非空、主键Cname varchar40Cpno varchar4与 course 表中 Cno 关联Ccredit smallint 6sc表的信息:字段名类型长度约束条件Sno varchar9非空、主键、与student表中Sno外键关联,级联删除Cno varchar 4Grade smallint6非空、主键、与course表中Cno外键关联(1)连接数据库,在 localhost 中点击鼠标右键(如图1所示),点击“新建数据库”,在弹出的窗口中输入数据库名称(如图2所示),然后单击“确定”,就完成了数据库的建立。
数据库实验五实验报告一、实验目的本实验旨在通过学习数据库的索引和优化,掌握数据库索引的使用和优化方法,进一步提升数据库的查询性能。
二、实验要求1.理解数据库索引的概念及作用。
2.熟悉索引的创建、删除和修改操作。
3.了解索引的类型及适用场景,并能选取合适的索引类型。
4.能通过观察执行计划和使用适当的策略对查询进行优化。
三、实验步骤1.索引的创建和删除首先,在已创建的数据库中选择适合创建索引的表。
通过如下语句创建一个测试表:CREATE TABLE test_table(id INT PRIMARY KEY,name VARCHAR(50),age INT);然后,可以在表的字段上创建索引,通过如下语句创建一个索引:CREATE INDEX idx_name ON test_table(name);索引创建完成后,可以通过如下语句删除索引:DROP INDEX idx_name ON test_table;2.索引的修改可以使用ALTER TABLE语句对已创建的索引进行修改。
例如,修改索引的名称:ALTER INDEX idx_name RENAME TO new_idx_name;或者修改索引的定义:ALTER INDEX idx_name RENAME COLUMN new_column_name;3.选择合适的索引类型在创建索引时,需要选择合适的索引类型。
常见的索引类型包括B树索引、哈希索引和全文索引。
- B树索引:适用于等值查询、范围查询和排序场景。
- 哈希索引:适用于等值查询,不支持范围查询和排序。
- 全文索引:适用于全文搜索场景。
4.查询优化在进行数据库查询时,可以通过观察执行计划来判断查询是否有优化空间。
执行计划是数据库在执行查询时生成的查询执行步骤和顺序图,可以根据执行计划优化查询。
另外,还可以通过以下策略对查询进行优化:- 使用合适的索引类型- 避免使用LIKE操作符- 避免使用SELECT *查询所有字段- 避免多表连接查询- 使用JOIN代替子查询- 避免使用不必要的DISTINCT操作符- 分页查询时,使用LIMIT关键字限制结果数量四、实验结果与分析通过实验,我们成功创建了一个测试表,并在该表的字段上创建了索引。
实验五用户、角色与权限管理一、实验目的及要求掌握Oracle的安全管理方法。
二、实验主要内容(1) 概要文件的建立、修改、查看、删除操作。
(2) 用户的建立、修改、查看、删除操作。
(3) 权限的建立、修改、查看、删除操作。
(4) 角色的建立、修改、查看、删除操作。
三、实验仪器设备在局域网环境下,有一台服务器和若干台客户机。
服务器成功安装Oracle 11g数据库服务器(企业版),客户机成功安装Oracle 11g客户端软件,网络服务配置正确,数据库和客户端正常工作。
四、实验步骤1创建概要文件。
①利用企业管理器创建概要文件“ygbx+学号_pro”,要求在此概要文件中CPU/会话为1000,读取数/会话为2000,登录失败次数为3,锁定天数为10。
②利用SQL*Plus或PL/SQL Developer,创建概要文件“ygbx+学号_pro_sql”,其结构与“ygbx+学号_pro”一致。
2 查看概要文件。
②利用企业管理器查看概要文件“ygbx+学号_pro”的信息。
②利用SQL*Plus或PL/SQL Developer,从DBA_PROFILES数据字典中查看“ygbx+学号_pro_sql”概要文件的资源名称和资源值等信息。
③利用SQL*Plus或PL/SQL Developer,从查看“ygbx+学号_pro_sql”概要文件中锁定天数的值。
3修改概要文件。
②利用企业管理器,修改“ygbx+学号_pro”概要文件,将CPU/会话改为4000,连接时间为60。
②利用SQL*Plus或PL/SQL Developer,修改“ygbx+学号_pro_sql”概要文件,将并行会话设为20,读取数/会话设为DEFAULT。
4创建用户。
①利用企业管理器,创建“ygbxuser+学号”用户,密码为“user+学号”,默认表空间为“ygbx_tbs”。
②利用SQL*Plus或PL/SQL Developer,创建“ygbxuser+学号_sql”用户,密码为“user+学号+sql”,该用户处于锁状态。
实验五数据控制(完整性)一实验目的熟悉SQL语句对数据库进行完整性控制的方法。
二实验环境微机;Windows xp操作系统;安装了SQL SERVER。
三实验内容使用SQL进行数据完整性控制:包括三类完整性、check短语、constrain子句。
1、在创建下列关系表时完成如下约束:定义实体完整性;参照完整性(外码、在删除S中的元组时级联删除SC中相应元组、当更新S中的Sno时同时更新SC中的Sno);用户定义完整性:学生年龄<30、所在系取值唯一。
2、修改S中的约束条件,学号在100-1000之间。
学生关系表S :页脚内容1创建课程关系表C :创建成绩关系表SC :3、用实验验证当操作违反了完整性约束时,系统如何处理?如:在S中插入一条记录,学号不在100-1000之间;在SC中插入一条记录,课程号在C表中没有。
4、删除C中的一条课程记录(该课程至少应有一学生选修,即在SC表中有记录),观察SC表中记录的变化。
5、删除2中增加的约束,再在S中插入一条记录,学号不在100-1000之间,结果如何?四实验结果(写出每次实验步骤以及结果1.在创建下列关系表时完成如下约束:定义实体完整性;参照完整性(外码、在删除S中的元组时页脚内容2级联删除SC中相应元组、当更新S中的Sno时同时更新SC中的Sno);用户定义完整性:学生年龄<30、所在系取值唯一。
2.修改S中的约束条件,学号在3901080400-3901080499之间。
3. 用实验验证当操作违反了完整性约束时,系统如何处理?如:在S中插入一条记录,学号不在3901080400-3901080499之间;在SC中插入一条记录,课程号在C表中没有。
页脚内容34.删除C中的一条课程记录(该课程至少应有一学生选修,即在SC表中有记录),观察SC表中记录的变化。
页脚内容45. 删除2中增加的约束,再在S中插入一条记录,学号不在3901080400-3901080499之间,结果如何?页脚内容5实验六存储过程建立与调用一、实验目的理解存储过程的概念、建立和调用方法。
宁波工程学院数据库理论与技术课程实验报告学院:电子与信息工程学院专业:计算机科学与技术班级:计科15- 实验时间: 2017年5月10日学号姓名成绩__ ___ __学号姓名成绩__ ___ __学号姓名成绩__ ___ __学号姓名成绩__ ___ __备注:排名第一的学生为组长,负责此实验任务的组织和分配,负责实验报告的整合和提交。
指导教师签字:实验五:SQL Server的综合练习一、实验目的和要求1、巩固并掌握数据定义语言的使用,正确认识创建数据库和数据表语句的作用,进一步理解数据类型和各类约束对实现数据完整性的重要性;2、巩固并掌握数据操纵语言的使用,正确认识数据查询和数据更新语句的作用,熟练掌握数据查询语句的使用;3、巩固并掌握创建视图语句的格式和功能,理解视图创建三个选项的含义,熟练掌握视图的一般应用。
4、要求学生在每次实验前,根据实验目的和内容设计出本次实验的具体步骤;在实验过程中,要求独立进行程序调试和排错,学会使用在线帮助和运用理论知识来分析和解决实验中遇到的问题,并记录实验的过程和结果;上机实验结束后,根据实验模板的要求写出实验报告,并对实验过程进行分析和总结。
二、实验内容与过程记录某仓储超市采用POS(Point of Sale)收银机负责前台的销售收款,为及时掌握销售信息,并依此指导进货,拟建立商品进、销、存数据库信息管理系统。
经过系统需求分析、概念结构设计和逻辑结构设计,可以简化得到如下一组关系模式(其中表示主键,表示外键):积分卡(用户编号,用户名,累积消费金额,积分点)销售详单(销售流水号,商品编码,数量,金额,用户编号,收银员,时间)销售日汇总(日期,商品编码,数量)存货表(商品编码,数量)进货表(送货号码,商品编码,数量,日期)商品(商品编码,商品名称,单价)请在SQL Server的查询分析器中按要求完成如下各题:1、创建名为Supermarket的数据库,数据文件名取为:Supermarket_data.mdf,日志文件名取为:Supermarket_log.ldf。
南昌航空大学实验报告二0一年月日课程名称:数据库原理实验名称:数据库的并发控制与恢复备份班级:姓名:同组人:指导教师评定:签名:1、实验环境1、 Windows2000或以上版本;2、SQLServer2000或2005。
二、实验目的1.掌握数据库并发控制与恢复备份基础知识;2.掌握创建、修改、使用、数据库并发控制与恢复的不同方法。
三、实验步骤及参考源代码实验一:数据库并发控制1、丢失数据create table sales(客户代号char(5)primary key,数量int null)insert into sales values('A0001',0)create procedure modi_a asdeclare @i intdeclare @s1 intset transaction isolation level read committed select @i=1while(@i<=2000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1+1 where客户代号='A0001'commit transelect @i=@i+1endcreate procedure modi_m asdeclare @i intdeclare @s1 intset transaction isolation level read committed select @i=1while(@i<=2000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1-1 where客户代号='A0001'commit transelect @i=@i+1end同时运行存储过程modi_a和modi_m可以看到如下结果:本应该数量一栏应该是0的,说明数据发生了丢失数据。
将两个存储过程中事务中select语句改为:select @s1=数量 from sales with(tablockx) where 客户代号=’A0001’然后再次同时运行两个存储过程,结果如下:可以看到如果在存储过程中对数据加上独立锁后数量结果始终为0。
2、脏读数据create procedure dirt_wroll asdeclare @i intdeclare @s1 intset transaction isolation level read uncommitted select @i=1while(@i<=16000)beginselect @i=@i+1begin transelect @s1=数量from sales where客户代号='A0001'update sales set数量=@s1+1 where客户代号='A0001'rollback tranwaitfor delay '00:00:00.000'endcreate procedure dirt_r asdeclare @i intdeclare @s1 intset transaction isolation level read uncommitted select @i=1while(@i<=60000)beginselect @i=@i+1begin transelect @s1=数量from sales where客户代号='A0001'if(@s1<>1000)raiserror('发生了脏读!',16,1)commit tranend并行运行上面两个存储过程dirt_wroll和dirt_r看到如下结果:可知如果是这样的话,就会发生脏读的现象。
如果把上述的存储过程中的设置隔离级别的语句“set transaction isolation level read uncommitted”改为:“set transaction isolation level read committed”则就可以把问题解决了。
3、不可重复读create procedure rep_r asdeclare @i intdeclare @s1 intdeclare @s2 intset transaction isolation level read committed select @i=1while(@i<=3000)beginselect @i=@i+1begin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.001'select @s2=数量from sales where客户代号='A0001'if(@s1<>@s2)raiserror('发生不可重复读!',16,1)commit tranendcreate procedure rep_w asdeclare @i intdeclare @s1 intdeclare @s2 intset transaction isolation level read committed select @i=1while(@i<=1000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1+1 where客户代号='A0001'commit transelect @i=@i+1end以上两个存储过程同时运行的时候,会出现不可重复的现象,结果如下:预防这种结果的方法就是制定更高的事务隔离级别,如:repeatable read、snapshot、serializable.4、幻影问题create procedure huany_I asdeclare @i intset transaction isolation level repeatable read delete from sales where(客户代号='A1111')select @i=1while(@i<=1000)beginbegin traninsert into sales(客户代号,数量)values('A1111',1000)commit tranwaitfor delay '00:00:00.001'select @i=@i+1endcreate procedure huany_u asdeclare @i intdeclare @j intset transaction isolation level repeatable read select @i=1while(@i<=300)beginbegin tranupdate sales set数量=数量+3 where客户代号='A1111'select @j=0select @j=count(*)from sales where客户代号='A1111'and数量=1000if(@j>0)raiserror('发生了幻影现象!',16,1)commit tranwaitfor delay '00:00:00.001'select @i=@i+1end同时运行上面两个存储过程huany_I和huany_u会出现幻影现象,结果如下图:解决的方法为:指定事务级别为serializable。
5、抢答问题create procedure qiangxian1 asdeclare @i intset transaction isolation level read committedselect @i=1while(@i<=5000)beginbegin tranupdate sale set数量=数量+10000 where客户代号=@iif(@@error<>0)rollback tranelse commit tran select @i=@i+1end当同时执行像上面多个存储过程的时候就会出现抢答现象,记录的修改只能由先加锁的进程完成。
6、编号产生问题create procedure bhsc asdeclare @i intdeclare @s1 intset transaction isolation level read committedselect @i=1while(@i<=1500)beginbegin transelect @s1=max(客户代号)+1 from saleinsert into sale(客户代号,数量)values(@s1,@i)commit transelect @i=@i+1end多个以上的存储过程并行运行会出现编号重复现象,而且发现重复程度与并发程度成正比。
解决的办法法有:(1)设计编号产生事务一开始就加独立锁;(2)设计编号产生事务,其中采用插入后即查询重复编号情况,若发现重复,能进行反复尝试再插入;(3)利用一般数据库具有的identity字段来保障编号的唯一性。
下面的存储过程体现了前两种方法,当多个此存储过程同时运行时不会在发生编号重复现象。
create procedure bhsc2 asdeclare @i intdeclare @s1 intdeclare @kk intselect transaction level read committedwhile(@i<=1500)beginbegin transelect @s1=max(客户代号)+1 from sale with(tablock) insert into sale(客户代号,数量)values(@s1,@i)select @kk=count(*)from sale where客户代号=@1if @kk>=2 begin rollback tran continue endelse commit transelect @i=@i+1end7、手工加锁下并发事务读写冲突create procedure pmin asset transaction isolation level read committedselect @i=1while(@i<=500)beginbegin transelect @s1=数量from sales with(updlock)where客户代号='A0001'waitfor delay '00:00:00.003'update sales set数量=@s1-1 where客户代号='A0001'if(@@error<>0)rollback tranelse commit transelect @i=@i+1;endcreate procedure padd asset transaction isolation level read committedselect @i=1while(@i<=500)beginbegin transelect @s1=数量from sales with(updlock)where客户代号='A0001'waitfor delay '00:00:00.003'update sales set数量=@s1+1 where客户代号='A0001'if(@@error<>0)rollback tranelse commit transelect @i=@i+1;end实验二:数据库备份与恢复(1)备份数据库创建用于存放jxgl数据库完整备份的逻辑备份设备,然后备份整个jxgl 数据库use masterexec sp_addumpdevice'disk','jxgl_1','C:\Program Files\Microsoft SQLServer\MSSQL.1\MSSQL\Backup\jxgl_1.dat'backup database JXGL to jxgl_1创建一个数据库和日志的完整备份。