北京邮电大学计算机学与技术大三数据库第8次实验报告.docx
《北京邮电大学计算机学与技术大三数据库第8次实验报告.docx》由会员分享,可在线阅读,更多相关《北京邮电大学计算机学与技术大三数据库第8次实验报告.docx(13页珍藏版)》请在冰点文库上搜索。
![北京邮电大学计算机学与技术大三数据库第8次实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-6/11/cabd05ad-8a95-424c-bb1d-1a062e196dbd/cabd05ad-8a95-424c-bb1d-1a062e196dbd1.gif)
北京邮电大学计算机学与技术大三数据库第8次实验报告
北京邮电大学
实验报告
课程名称数据库系统概念
实验名称数据库事务创建与运行实验
_计算机_系_302_班姓名华逸群
_计算机_系_302_班姓名魏乐业
教师_叶文吴起凡_成绩_________
2013年6月5日
实验目的
通过实验,了解SQLSERVER数据库数据库系统中各类数据库事务的定义机制和基于锁的并发控制机制,掌握SQLSERVER数据库系统的事务控制机制。
实验环境
采用SQLSERVER数据库管理系统作为实验平台。
其中,SQLSERVER可以采用2005、2008及2012的企业版本等高级版本。
实验背景
多用户或者多进程并发操作数据库时必须有事务的概念,其具备ACID原则。
SQLSERVER也不例外,它的事务可分成以下几种:
显式事务:
以BEGINTRANSACTION开始,COMMITTRANSACTION结束,中间是一系列属于该事务的SQL语句。
如果有错,可以用ROLLBACKTRANSACTION语句来撤销。
隐式事务:
使用SETIMPLICIT_TRANSACTIONON命令,可以在本连接上开始一个隐式事务。
除非显式执行COMMITTRANSACTION或者ROLLBACKTRANSACTION,该事务不会完成。
自动提交事务:
如果连接没有设置为前两种事务,则其对每一条SQL语句自动提交,即它是包含一条SQL语句的事务。
事务针对数据的修改,就是CRUD(Create、Read、Update和Delete的时候起作用。
完全实现ACID原则非常困难,而实现ACID原则的方法是非常灵活的,SQLSERVER使用冗余结构,即使用事务日志来实现事务的各种功能。
1.显式执行模式:
以begintransaction开始,以committransaction、rollbacktransaction结束。
要注意SQLSERVER中事务不会自己检查错误,所以需要我们在事务中进行处理,写成如下形式:
BEGINTRAN
BEGINTRY
一系列SQL语句
COMMITTRAN
ENDTRY
CATCH
RAISERROR(‘TransactionAborted’,16,1)
ROLLBACKTRAN
ENDCATCH
2.隐式事务:
略。
3.自动提交模式:
略。
实验内容与要求
一、在MSSQLSERVER中实现单事务
1.分别以三种事务方式,执行以下操作:
(1)首先查看小区/扇区ID在9011和9143之间的小区的LAC号;
(2)然后将小区/扇区ID在9011和9143之间的小区的LAC号更新为14120,将小区/扇区ID在9151和9293之间的小区的LAC号更新为14121,将小区/扇区ID在9311和9573之间的小区的LAC号更新为14123;
(3)最后再次查看小区/扇区ID在9011和9143之间的小区的LAC号。
将以上操作组织成事务,分别执行下面两个操作:
(1)执行rollback语句,观察此次操作的结果。
(2)先执行commit语句,再执行rollback语句,观察此次操作的结果。
2.数据库模式修改
(1)修改GSM数据库中的表MSC的模式,删除列MSC海拔(使用altertabledrop)。
(2)修改GSM数据库中的表MSC的模式,增加列MSC海拔(使用altertableadd)。
分别针对以上操作分别执行以下语句:
(1)执行rollback语句,观察此次操作的结果。
(2)先执行commit语句,再执行rollback语句,观察此次操作的结果。
查看数据库,数据库模式修改语句(altertable),是否会受到rollback,commit语句的影响。
会受到相关影响。
可以自行创建表、删除表,重复以上两步,查看数据库,数据库模式定义语句(createtable)模式修改语句(droptable)是否会受到rollback,commit语句的影响。
会受到相关影响。
3.执行比较
(1)成功执行比较
a.查询所属交换机MscID=5214的BSCID、BSCName;
b.在表BSC中,添加一条BSC的信息,其所属交换机MscID=5214;
c.删除b所添加的BSC的信息;
d.查询所属交换机MscID=5214的BSCID、BSCName。
针对以上操作分别进行如下的操作:
a.将以上操作组织成普通的SQL语句,顺序执行。
b.将以上操作组织成事务执行(以begintran开始,以committran结束)。
查看数据库,观察两次的执行结果有何异同。
(2)失败执行比较
a.查询全网BSC的基本信息;
b.在表BSC中,添加一条BSC的信息,其所属交换机MscID=5214;
c.在表BSC中,添加一条BSC的信息,其所属交换机MscID=5220(注意此时MscID不满足外键约束);
d.查询全网BSC的基本信息。
针对以上操作分别进行如下的操作:
a.将以上操作组织成普通的SQL语句,顺序执行。
b.将以上操作组织成事务执行(以begintran开始,以committran结束)。
查看数据库,观察两次的执行结果有何异同。
4.针对
(1)成功执行比较创建的事务,在不同位置设置保存点savepoint(例如添加之后、添加之前、删除之后等),使用SAVETRANSACTIONsavepoint_name语句创建保存点,使用ROLLBACKTRANSATCTIONtosavepoint_name语句将事务回滚,观察每次操作的结果。
保存点提供了回滚部分事务的机制,而不是回滚到事务的开始。
例如:
begintran
insertintoMSCvalues(5217,'HWMSC',Huawei,121.14329,41.15872,1500);
insertintoMSCvalues(5218,'HWMSC',Huawei,121.14349,41.15862,1500);
savetransctionsavepointppp;
deletefromMSCwhereMscID=5217;
rollbacktransactiontoppp;
committran
二、实现事务的并发执行
本组实验关于涉及到事务的隔离级别,锁信息
事务指定一个隔离级别,该隔离级别定义一个事务必须与由其他事务进行的资源或数据更改相隔离的程度。
隔离级别从允许的并发副作用(例如,脏读或虚拟读取)的角度进行描述。
事务隔离级别控制以下各项:
读取数据时是否占用锁以及所请求的锁类型。
占用读取锁的时间。
引用其他事务修改的行的读取操作是否:
在该行上的排他锁被释放之前阻塞其他事务。
检索在启动语句或事务时存在的行的已提交版本。
读取未提交的数据修改。
选择事务隔离级别不影响为保护数据修改而获取的锁。
事务总是在其修改的任何数据上获取排他锁并在事务完成之前持有该锁,不管为该事务设置了什么样的隔离级别。
对于读取操作,事务隔离级别主要定义保护级别,以防受到其他事务所做更改的影响。
较低的隔离级别可以增强许多用户同时访问数据的能力,但也增加了用户可能遇到的并发副作用(例如脏读或丢失更新)的数量。
相反,较高的隔离级别减少了用户可能遇到的并发副作用的类型,但需要更多的系统资源,并增加了一个事务阻塞其他事务的可能性。
应平衡应用程序的数据完整性要求与每个隔离级别的开销,在此基础上选择相应的隔离级别。
最高隔离级别(可序列化)保证事务在每次重复读取操作时都能准确检索到相同的数据,但需要通过执行某种级别的锁定来完成此操作,而锁定可能会影响多用户系统中的其他用户。
最低隔离级别(未提交读)可以检索其他事务已经修改、但未提交的数据。
在未提交读中,所有并发副作用都可能发生,但因为没有读取锁定或版本控制,所以开销最少。
下表显示了不同隔离级别允许的并发副作用。
隔离级别
脏读
不可重复读
幻读
未提交读
是
是
是
已提交读
否
是
是
可重复读
否
否
是
快照
否
否
否
可序列化
否
否
否
事务必须至少在可重复读的隔离级别运行,才能在两个事务都检索同一行,然后根据原先检索的值更新行时,防止出现丢失更新的情况。
如果两个事务使用一个UPDATE语句更新行,而且更新并不以先前检索的值为基础,则在默认的已提交读的隔离级别上不会发生丢失更新的情况。
若要为事务设置隔离级别,可以使用SQLServerConnection类的setTransactionIsolation方法。
此方法接受int值作为其参数,此参数基于如下所示的连接常量之一:
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
若要使用SQLServer的新的快照隔离级别,可以使用以下所示的SQLServerConnection常量之一:
con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);
或者,可以使用:
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED+4094);
在ADO.NET的设置则是:
用System.Data.SqlClient托管命名空间的ADO.NET应用程序可以调用SqlConnection.BeginTransaction方法并将IsolationLevel选项设置为Unspecified、Chaos、ReadUncommitted、ReadCommitted、RepeatableRead、Serializable或Snapshot。
就是SqlConnection中设置了,代码如下:
System.Data.SqlClient.SqlConnectioncon=newSqlConnection();
con.BeginTransaction(IsolationLevel.ReadUncommitted);
查看MicrosoftSQLServer数据库支持的事务隔离级别的种类、每种隔离级别的特征。
使用SETTRANSACTIONISOLATIONLEVELReadUnCommitted语句为当前事务设置隔离级别,请尝试给当前连接设置不同的隔离级别。
自己寻找方法检查当前连接隔离级别。
查看各个隔离级别的典型事务。
1.锁信息
(1)查看SQLSERVER数据库使用的各种类型的锁、锁的持续时间。
(2)隔离级别与锁的关系
根据选择的隔离级别,数据库服务器将使用锁类型中的一些或全部来保持所要求的一致性等级。
根据需要使用模式锁、行锁、表锁等来确保所要求的一致性级别,不需要显式请求使用某个特定的锁定。
而应通过选择最符合要求的隔离级别来控制所维护的一致性级别。
了解各种锁类型有助于选择隔离级别和理解各个级别对性能的影响。
(SETTRANSACTIONISOLATIONLEVEL{READCOMMITTED|READUNCOMMITTED|REPEATABLEREAD|SERIALIZABLE})
READCOMMITTED
指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。
该选项是SQLServer的默认值。
避免脏读,并在其他session在事务中不能对已有数据进行修改。
共享锁。
READUNCOMMITTED
执行脏读或0级隔离锁定,这表示不发出共享锁,也不接受排它锁。
当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。
该选项的作用与在事务内所有语句中的所有表上设置NOLOCK相同。
这是四个隔离级别中限制最小的级别。
REPEATABLEREAD
锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。
因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
SERIALIZABLE
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。
这是四个隔离级别中限制最大的级别。
因为并发级别较低,所以应只在必要时才使用该选项。
该选项的作用与在事务内所有SELECT语句中的所有表上设置HOLDLOCK相同。
设置锁的时间
SetLock_TimeOut5000设置锁时间为5000毫秒
隔离级别与锁的关系
根据选择的隔离级别,数据库服务器将使用锁类型中的一些或全部来保持所要求的一致性等级。
根据需要使用模式锁、行锁、表锁等来确保所要求的一致性级别,不需要显式请求使用某个特定的锁定。
而应通过选择最符合要求的隔离级别来控制所维护的一致性级别。
了解各种锁类型有助于选择隔离级别和理解各个级别对性能的影响。
隔离级别脏读不可重复读取幻像说明
未提交读是是是如果其他事务更新,不管是否提交,立即执行
提交读否是是读取提交过的数据。
可重复读否否是查询期间,不允许其他事务update
可串行读否否否查询期间,不允许其他事务insert或delete
2.设计2个带有冲突操作的并发事务,由2个不同用户或者说2个不同连接启动,并分别设置不同的隔离级别
2个用户分别启动各自的事务,观察事务的执行情况:
(1)利用sys.dm_tran_locks等系统视图列出有关数据库中保留的锁的信息。
也可以使用其它方法列出事务上的锁。
提示:
设法让事务停留在未完成状态再查看锁,否则事务很快执行完成,则锁也随即释放。
如果先运行事务Ⅰ,然后紧接着运行事务Ⅱ,则事务Ⅱ要等待10秒钟(一个连接在修改数据块时别的连接也不能查询这个数据块,直到解锁。
反之亦然:
读的时候不能写和修改)。
实验总结
在实验中有哪些重要问题或者事件?
你如何处理的?
你的收获是什么?
有何建议和意见等等。
通过这次实验,对于事务的概念有了更好的理解。
首先熟悉了对于事务的使用,使用事务可以实现数据库数据修改的安全性,在多线程,多用户的数据库系统中显得尤为重要。
然后对于数据库系统对于实现事务的机理也有了更好的认识,对于隔离级别,事务锁等概念有了更好的理解。