数据库实验u201116097苏喆
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库实验报告
1.向学生表中插入一行数据,然后提交,退出后重新进入,查看提交后结果
Begin transaction
insert into "学生表"
values(1,'张三','男',1)
insert into "学生表"
values(2,'王五','女',1)
insert into "学生表"
values(3,'李六','男',2)
insert into "学生表"
values(4,'周七','女',2)
commit tran
2.向学生表中插入一行数据,然后回滚,退出后重新进入,查看回滚后结果
Begin transaction
insertinto"成绩表"values(1,1,90)insertinto"成绩表"values(1,2,85)insertinto"成绩表"values(2,1,80)insertinto"成绩表"values(2,2,75)insertinto"成绩表"values(3,1,88)insertinto"成绩表"values(3,2,95)insertinto"成绩表"values(4,1,70)insertinto"成绩表"values(4,2,75)
rollback tran
3.依次执行下列语句,查看运行结果,并总结begin transaction 和commit transaction 的作用
begin transaction表示事务的开始,commit transaction表示提交,事务正常结束4.依次执行下列语句,查看运行结果,并总结begin transaction 和rollback transaction 的作用
begin transaction表示事务的开始,commit transaction表示事务非正常结束,撤消事务已做的操作,回滚到事务开始时状态
5.依次执行下列语句,查看运行结果,说明最后一个select语句可以正常执行的原因
test1本身存在,回滚之后依然存在,所以最后一个select语句可以正常执行
:
6.在已建立的数据表test1的基础上,依次执行下列语句(请按要求严格操作)
..........打开一个查询分析器,开始一个事物的执行,这个查询分析器称为第一个查询分析器,为了区别,我们把第一个查询分析器的事务代码设为红色:
BEGIN TRAN
UPDATE test1 SET iname=’A’ WHERE id=1
WAITFOR DELAY '00:00:20' --等待20秒
COMMIT TRAN
打开另一个查询分析器,开始另一个事物的执行,这个查询分析器称为第二个查询分析器,为了区别,我们把第二个查询分析器的事务代码设为蓝色:
BEGIN TRAN
UPDATE test1 SET iname=’B’ WHERE id=1
COMMIT TRAN
回到第一个查询分析器清空,执行下列操作:BEGIN TRAN
UPDATE test1 SET iname=’C’ WHERE id=1 WAITFOR DELAY '00:00:20' --等待20秒
UPDATE test1 SET iname=’D’ WHERE id=1 COMMIT TRAN
再回到第二个查询分析器清空,执行下列操作:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRAN
SELECT iname FROM test1 WHERE id=1
COMMIT TRAN
回到第一个查询分析器清空,执行下列操作:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
--或者SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRAN
SELECT iname FROM test1 WHERE id=1
WAITFOR DELAY '00:00:20' --等待20秒
SELECT iname FROM test1 WHERE id=1
COMMIT TRAN
再回到第二个查询分析器清空,执行下列操作:BEGIN TRAN
UPDATE test1 SET iname=’Z’ WHERE id=1 COMMIT TRAN
question 1:这时第二个查询分析器的执行结果是什么?为什么会出现这种现象?
1行受影响,因为第一个查询已经创建了表test1,回滚后test1依然存在,故test1的第一行变成了B
question 2:这时第二个查询器又出现了什么样的执行结果?为什么会出现这种现象?
test1的第一行为D,因为上一个查询最后一步把test1的第一行改为了D,且最后为COMMIT TRAN,提交了,事务正常结束
question 3: 这时第二个查询器又出现了什么样的执行结果?为什么会出现这种现象?
1行受影响,因为test1原来第一行为D,最后为COMMIT TRAN,将第一行改为了Z question 4: 结合上述实验,分析DBMS并发控制中的四种隔离程度:未提交读,提交读,可重复读,串行读的区别。
未提交读:
表示不发出共享锁,也不接受排它锁。
在READ UNCOMMITTED级别运行的事务,不会发出共享锁来防止其他事务修改当前事务读取的数据。
READ UNCOMMITTED事务也不会被排他锁阻塞,排他锁会禁止当前事务读取其他事务已修改但尚未提交的行。
设置此选项之后,可以读取未提交的修改,这种读取称为脏读。
在事务结束之前,可以更改数据中的值,行也可以出现在数据集中或从数据集中消失。
该选项的作用与在事务内所有SELECT语句中的所有表上设置 NOLOCK 相同。
这是隔离级别中限制最少的级别。
提交读:
指定语句不能读取已由其他事务修改但尚未提交的数据。
这样可以避免脏读。
其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻像数据。
这个级别存在两种类型:已提交读和已提交
读快照隔离级别。
应用哪种类型由数据库选项定义。
已提交读级别会在读数据之前等待,直到阻塞锁被释放。
已提交读快照级别会在数据被其他事务阻塞时使用行版本控制来读数据最后一次提交的版本。
该选项是 SQL Server 的默认设置。
可重复读:
锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。
因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
a、指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都不能在当
前事务完成之前修改由当前事务读取的数据。
b、对事务中的每个语句所读取的全部数据都设置了共享锁,并且该共享锁一直保持到事务完成
为止。
这样可以防止其他事务修改当前事务读取的任何行。
其他事务可以插入与当前事务所
发出语句的搜索条件相匹配的新行。
如果当前事务随后重试执行该语句,它会检索新行,从
而产生幻读。
由于共享锁一直保持到事务结束,而不是在每个语句结束时释放
串行读:
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。
这是四个隔离级别中限制最大的级别。
该选项的作用与在事务内所有SELECT语句中的所有表上设置 HOLDLOCK 相同。
范围锁处于与事务中执行的每个语句的搜索条件相匹配的键值范围之内。
这样可以阻止其他事务更新或插入任何行,从而限定当前事务所执行的任何语句。
这意味着如果再次执行事务中的任何语句,则这些语句便会读取同一组行。
在事务完成之前将一直保持范围锁。