一、 实验目的
事务处理及其并发控制是所有数据库产品的一个关键问题,是提供数据一致性和可恢复性的重要保障,事务处理方式的不同会导致数据库性能和功能上的巨大差异,熟练掌握数据库事务处理和并发控制的基本原理对于后续的学习和工作有着重要的帮助。
1). 通过试验,加深学生对事务的基本概念理解语掌握;
2). 通过试验,加深学生对并发控制的基本概念理解,认识不正确的并发控制所带来的危害;
3). 通过试验,加深学生对锁的基本概念的掌握与理解,认识锁带来的问题;
二、 实验内容
1、内容:事务的控制
2、内容:事务的隔离级别试验 3、内容:锁的模拟
三、 实验步骤
1、SQL Server 事务模式
(1) 自提交事务模式 (SQL Server 默认模式):建立一个查询后,分别运行
多条插入、修改与删除语句,观察表中数据的变化
(2) 隐式事务模式:设置SQL Server为隐式事务模式,分别运行多条插入、
修改与删除语句以后,再执行commit或rollback,观察表中数据的变化。 注:
(3) 显示事务模式:用begin tran…………commit 和begin tran…………
rollback,启动事务和结束事务,观察表中数据的变化。
2、事务的控制
数据准备:执行如下命令Select * into stu from student,将student的数据倒入到stu表中。
(1)启动一个事务,执行删除后,回滚事务,具体步骤如下:
选择stu的数据,察看记录总数 显式启动事务 删除stu表的数据
选择stu中数据,察看记录总数 回滚事务
选择stu中数据,察看记录总数
(2)启动事务,执行删除后,提交事务,具体步骤如下:
选择stu数据,察看记录总数 显式启动事务 删除stu表的数据
选择stu的数据,察看记录总数 回滚事务
选择stu数据,察看记录总数
(3)比较这两次执行效果的差异,为什么会有这些差异?
3、事务的隔离级别试验
数据准备:执行如下命令Select * into stu from student,将student的数据倒入到stu表中。 (1)脏读,具体步骤如下:
建立两个查询窗口,分别叫A、B
在A中,选择stu表中数据,察看记录总数 在A中,显式启动事务 在A中,删除stu表的数据
在A中,选择stu数据,察看记录总数 在B中,将事务隔离级别设为UNCOMMITTED 在B中,选择stu表数据,察看记录总数 在A中,回滚事务
在A中,选择stu数据,察看记录总数 在B中,选择stu数据,察看记录总数 观察结果,为什么会有这些现象? (2)不可重复读
建立两个查询窗口,分别叫A、B 在A中,显式启动事务,察看classno= '201301'的记录(注意classno
中的数据) 在B中,显式启动事务,察看classno= '201301'的记录(注意classno
中的数据)
在B中,将classno= '201101'中的班级更新为’201305’ 在B中,再次察看classno= '201301'的记录(注意classno中的数
据)
在B中,提交事务
在A中,再次察看将classno= '201301'的记录(注意classno中的
数据)
在A中,提交事务
观察结果,为什么会有这些现象? (3)丢失修改
建立两个查询窗口,分别叫A、B 在A中,显式启动事务,察看classno= '201301'的记录(注意classno
中的数据) 在B中,显式启动事务,察看classno= '201301'的记录(注意classno
中的数据)
在B中,将classno= '201301'中的班级更新为’201305’ 在B中,将classno= '201301'中的班级更新为’201305’ 在B中,提交事务
在A中,再次察看classno= '201301'的记录(注意classno中的数
据)
在A中,将classno= '201301'中的班级更新为’201308’ 在A中,提交事务
在A,B窗口分别察看classno= '201301'的记录,结果如何,为什
么?
4、锁的模拟
建立两个查询窗口,分别叫A、B
在A中,显式启动事务,察看classno= '201301'的记录 在B中,显式启动事务,察看classno= '201301'的记录 在B中,将classno= '201301'中的班级更新为’201305’ 在A中,将classno= '201301'中的班级更新为’201305’ 观察A窗口的结果,为什么? 在B中,提交事务
观察A窗口的结果,为什么? 在A窗口,再次察看classno= '201301'中的班级更新为’201305’
的记录,结果如何,为什么?
附常用命令:
启动事:begin transaction 启动事务:commit 回滚事务:rollback
事务隔离级别设置:set transaction isolation level {read committed, read uncommitted, repeatable read, serializable}
设置隐式模式:SET IMPLICIT_TRANSACTIONS { ON | OFF }
四.实验习题源程序(SQL命令)清单与运行结果
use HH
1、 SQL Server 事务模式
(1) 自提交事务模式 (SQL Server 默认模式):建立一个查询后,分别运行多条插入、修改与删除语句,观察表中数据的变化
insert into sc values ('201310801009','coo2','99') insert into class values ('20131080','13计本','jsj') update student set sname='何静' where classno='2010JS2' delete student where sname='张三' select *from student select *from sc select *from class
(2) 隐式事务模式:设置SQL Server为隐式事务模式,分别运行多条插入、修改与删除语句以后,再执行commit或rollback,观察表中数据的变化。 SET IMPLICIT_TRANSACTIONS ON
insert into sc values ('201310801009','coo2','99') insert into class values ('20131080','13计本','jsj') update student set sname='何静' where classno='2010JS2' delete student where sname='张三' select *from student select *from sc select *from class
commit
begin tran
insert into sc values ('201310801009','coo2','99') insert into class values ('20131080','13计本','jsj') update student set sname='何静' where classno='2010JS2' delete student where sname='张三' select *from student select *from sc select *from class rollback
(3) 显示事务模式:用begin tran…………commit 和begin tran…………rollback,启动事务和结束事务,观察表中数据的变化。 begin tran
insert into sc values ('201310801009','coo2','99') insert into class values ('20131080','13计本','jsj') update student set sname='何静' where classno='2010JS2' delete student where sname='张三' select *from student select *from sc select *from class commit
begin tran
insert into sc values ('201310801009','coo2','99') insert into class values ('20131080','13计本','jsj') update student set sname='何静' where classno='2010JS2' delete student where sname='张三' select *from student select *from sc select *from class rollback
2、 事务的控制
数据准备:执行如下命令Select * into stu from student,将student的数据倒入到stu表中。
Select * into stu from student select *from stu
(1)启动一个事务,执行删除后,回滚事务,具体步骤如下: 选择stu的数据,察看记录总数 select *from stu 显式启动事务 begin tran
删除stu表的数据
delete stu where sname='何静' and sex='女' 选择stu中数据,察看记录总数 select *from stu
回滚事务 rollback
选择stu中数据,察看记录总数 select *from stu
(2)启动事务,执行删除后,提交事务,具体步骤如下: 选择stu数据,察看记录总数 select *from stu 显式启动事务 begin tran
删除stu表的数据
delete stu where sname='何静' and sex='女' 选择stu的数据,察看记录总数 select *from stu 回滚事务 rollback
选择stu数据,察看记录总数 select *from stu
(3)比较这两次执行效果的差异,为什么会有这些差异?
3、 事务的隔离级别试验
数据准备:执行如下命令Select * into stu from student,将student的数据倒入到stu表中。
Select * into stu from student (1)脏读,具体步骤如下:
建立两个查询窗口,分别叫A、B
在A中,选择stu表中数据,察看记录总数 select *from stu
在A中,显式启动事务 begin tran
在A中,删除stu表的数据
delete stu where sname='何静' and sex='女' 在A中,选择stu数据,察看记录总数 select *from stu
在B中,将事务隔离级别设为UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 在B中,选择stu表数据,察看记录总数 select *from stu 在A中,回滚事务 rollback
在A中,选择stu数据,察看记录总数 select *from stu
在B中,选择stu数据,察看记录总数 select *from stu
观察结果,为什么会有这些现象?
(2)不可重复读
建立两个查询窗口,分别叫A、B
在A中,显式启动事务,察看classno= '201301'的记录(注意classno中的数据) begin tran
select *from Stu where classno= '20131080'
在B中,显式启动事务,察看classno= '201301'的记录(注意classno中的数据) begin tran
select *from Stu where classno= '201301'
在B中,将classno= '201101'中的班级更新为’201305’ update stu set Classno='201305' where classno= '20131080'
在B中,再次察看classno= '201301'的记录(注意classno中的数据) select *from Stu where classno= '20131080' 在B中,提交事务 commit
在A中,再次察看将classno= '201301'的记录(注意classno中的数据) select *from Stu where classno= '20131080' 在A中,提交事务 commit
观察结果,为什么会有这些现象? (3)丢失修改
建立两个查询窗口,分别叫A、B
在A中,显式启动事务,察看classno= '20131080'的记录(注意classno中的数据) begin tran
select *from Stu where classno= '20131080'
在B中,显式启动事务,察看classno= '201301'的记录(注意classno中的数据) begin tran
select *from Stu where classno= '20131080'
在B中,将classno= '201301'中的班级更新为’201305’ update stu set Classno='201305' where classno= '20131080' 在B中,提交事务 commit
在A中,再次察看classno= '201301'的记录(注意classno中的数据) select *from Stu where classno= '20131080'
在A中,将classno= '201301'中的班级更新为’201308’ update stu set Classno='201305' where classno= '20131080' 在A中,提交事务 commit
在A,B窗口分别察看classno= '201301'的记录,结果如何,为什么? select *from Stu where classno= '20131080'
4、 锁的模拟
建立两个查询窗口,分别叫A、B
在A中,显式启动事务,察看classno= '201301'的记录 begin tran
select *from Stu where classno= '20131080'
在B中,显式启动事务,察看classno= '201301'的记录 begin tran
select *from Stu where classno= '20131080'
在B中,将classno= '201301'中的班级更新为’201305’ update stu set Classno='201305' where classno= '20131080' 在A中,将classno= '201301'中的班级更新为’201305’ update stu set Classno='201305' where classno= '20131080' 观察A窗口的结果,为什么? 在B中,提交事务 commit
观察A窗口的结果,为什么?
在A窗口,再次察看classno= '201301'中的班级更新为’201305’的记录,结果如何,为什么?
select *from stu where Classno='201305' 附常用命令:
启动事:begin transaction 启动事务:commit 回滚事务:rollback
事务隔离级别设置:set transaction isolation level {read committed, read uncommitted, repeatable read, serializable}
设置隐式模式:SET IMPLICIT_TRANSACTIONS { ON | OFF }
五.实验总结
因篇幅问题不能全部显示,请点此查看更多更全内容