数据库事务创建与运行.docx
- 文档编号:8941677
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:17
- 大小:296.94KB
数据库事务创建与运行.docx
《数据库事务创建与运行.docx》由会员分享,可在线阅读,更多相关《数据库事务创建与运行.docx(17页珍藏版)》请在冰点文库上搜索。
数据库事务创建与运行
北京邮电大学
实验报告
课程名称数据库系统概念
实验名称实验8数据库事务创建与运行
__系___班姓名
__系___班姓名
教师______成绩_________
2011年5月25日
实验目的
通过实验,了解DB2或Sybase数据库数据库系统中各类数据库事务的定义机制和基于锁的并发控制机制,掌握DB2或Sybase数据库系统的事务控制机制。
实验环境
采用IBMDB2或Sybase数据库管理系统作为实验平台。
其中,DB2可以采用DB2Express-C或DB2V8Enterprise。
Sybase数据库可以采用SybaseSQLAnywhereStudio(SAS)或SybaseAdaptiveServerEnterprise(ASE)。
实验背景
SybaseSQLAnywhere数据库系统中有两种事务执行模式:
显式、自动提交。
1.显式执行模式:
以begintran开始,以committran、rollbacktran、commit、rollback结束。
2.自动提交模式:
InteractiveSQL提供auto_commit选项,可用来控制自动提交模式。
如果将auto_commit选项设置为On,则InteractiveSQL将自动在成功执行每一语句后提交您的结果,并且自动在每一失败的语句后执行ROLLBACK。
如果将auto_commit选项设置为Off,那么每条成功执行的语句只有在显式执行commit之后,才能最终写入数据库。
auto_commit缺省设置为off。
实验内容与要求
Sybase实验
一、在InteractiveSQL中实现单事务
1.通过setoption语句设置auto_commit的值(例:
setoptionauto_commit=off),分别在auto_commit为off、on时执行以下操作:
打开自动提交:
(1)首先查看小区/扇区ID在9011和9143之间的小区的LAC号;
(2)然后将小区/扇区ID在9011和9143之间的小区的LAC号更新为14120,将小区/扇区ID在9151和9293之间的小区的LAC号更新为14121,将小区/扇区ID在9311和9573之间的小区的LAC号更新为14123;
updateCELLsetLACnum=casewhen
CellIDbetween9011and9143then14120
whenCellIDbetween9151and9293then14121
whenCellIDbetween9311and9573then14123
end
(3)最后再次查看小区/扇区ID在9011和9143之间的小区的LAC号。
将以上操作组织成事务,分别执行下面两个操作:
(1)执行rollback语句,观察此次操作的结果。
由于是打开了自动提交,所以不用做成事务。
执行后无变化,没有回滚。
(2)先执行commit语句,再执行rollback语句,观察此次操作的结果。
执行后无变化,没有回滚。
关闭自动提交:
首先做成一个事务:
begintran
updateCELLsetLACnum=casewhen
CellIDbetween9011and9143then14120
whenCellIDbetween9151and9293then14121
whenCellIDbetween9311and9573then14123
end
rollback
1)先执行rollback:
可以看到没有变化。
2)先执行commit,再执行rollback:
begintran
updateCELLsetLACnum=casewhen
CellIDbetween9011and9143then14120
whenCellIDbetween9151and9293then14121
whenCellIDbetween9311and9573then14123
end
commit
rollback
可以看到数据库改变了。
所以在打开自动提交的模式下,事务在运行后立刻就被提交了,所以执行rollback没有任何效果。
在关闭了自动提交模式后,要想成功的执行事务必须要加上commit。
若没有commit而直接执行rollback,结果不会提交给数据库,即没有改变数据库,语句没有生效。
2.数据库模式修改
(1)修改GSM数据库中的表MSC的模式,删除列MSC海拔(使用altertabledrop)。
altertableMSCdropMscAltitude;
(2)修改GSM数据库中的表MSC的模式,增加列MSC海拔(使用altertableadd)。
altertableMSCaddMscAltitudeeintnull;
分别针对以上操作分别执行以下语句:
(1)执行rollback语句,观察此次操作的结果。
(2)先执行commit语句,再执行rollback语句,观察此次操作的结果。
查看数据库,数据库模式修改语句(altertable),是否会受到rollback,commit语句的影响。
在这个版本的sybase中,貌似altertable在事务中根本没法运行。
另外查资料知,altertable语句在事务中可以运行的话也不会受到commit和rollback的影响。
可以自行创建表、删除表,重复以上两步,查看数据库,数据库模式定义语句(createtable)模式修改语句(droptable)是否会受到rollback,commit语句的影响。
可以看到,此处的创建和删除table的操作也不可以在事务中运行。
3.执行比较
(1)成功执行比较
a.查询所属交换机MscID=5214的BSCID、BSCName;
b.在表BSC中,添加一条BSC的信息,其所属交换机MscID=5214;
c.删除b所添加的BSC的信息;
d.查询所属交换机MscID=5214的BSCID、BSCName。
针对以上操作分别进行如下的操作:
a.将以上操作组织成普通的SQL语句,顺序执行。
selectBscId,BscNamefromBSCwhereMscID=5214
insertintoBSCvalues(42244,5214,'dfgsdgf','gggg',121.89,41.45)
deletefromBSCwhereBscId=42244
selectBscId,BscNamefromBSCwhereMscID=5214
同时观察数据库,发现没有增加新的行,说明内部的insert和delete命令也成功执行了。
b.将以上操作组织成事务执行(以begintran开始,以committran结束)。
做成一个事务,执行后发现运行的结果也和之前的一样。
(2)失败执行比较
a.查询全网BSC的基本信息;
b.在表BSC中,添加一条BSC的信息,其所属交换机MscID=5214;
c.在表BSC中,添加一条BSC的信息,其所属交换机MscID=5220(注意此时MscID不满足外键约束);
d.查询全网BSC的基本信息。
针对以上操作分别进行如下的操作:
a.将以上操作组织成普通的SQL语句,顺序执行。
select*fromBSC
insertintoBSCvalues(42214,5214,'fdgd','jjjfgh',121.135465,41.124677)
insertintoBSCvalues(42213,'lllll','dddddddddddl',121.135465,41.124677,5220)
select*fromBSC
报错信息如上图。
b.将以上操作组织成事务执行(以begintran开始,以committran结束)。
查看数据库,观察两次的执行结果有何异同。
并没有发现不同,都是一样的报错信息。
另外,如果把错误的地方去掉,结果都会正确执行。
4.针对
(1)成功执行比较创建的事务,在不同位置设置保存点savepoint(例如添加之后、添加之前、删除之后等),使用rollbacktosavepoint语句将事务回滚,观察每次操作的结果。
begintran
savepointfirst
insertintoBSCvalues(42214,5214,'fdgd','jjjfgh',121.135465,41.124677)
rollbacktosavepointfirst
commit
可以发现没有成功执行。
直接跳回到savepoint,然后commit,所以不会执行插入操作。
去掉savepoint后,就可以发现成功插入了。
二、在InteractiveSQL中实现事务的并发执行
本组实验会涉及到事务的隔离级别,锁信息(详细内容参见附录三、SAS10.0.1技术文档)
1.事务隔离级别
(1)查看Syabse数据库支持的事务隔离级别的种类、每种隔离级别的特征。
在数据库实现中,通过锁定机制控制数据库的并发访问,保证数据库访问的正确性。
根据定义:
锁定是一种并发控制机制:
它可以确保数据在同一事务中和不同事务之间保持一致。
在多用户环境中,由于几个用户可能会在同一时间使用同一数据,因此需要锁定功能。
按照锁性质可以分为共享锁,排他锁。
当在数据库事务中,读取信息时,会对数据库添加共享锁。
当修改信息时,会添加排他锁。
按照锁的粒度,可以分为行锁,页锁,表锁等。
(2)使用SETOPTIONISOLATION_LEVEL语句为当前用户、用户或组、当前连接设置不同的隔离级别。
语句如下:
settransactionisolationlevel1
(3)使用CONNECTION_PROPERTY函数检查当前连接隔离级别。
例:
SELECTCONNECTION_PROPERTY('isolation_level')
(4)查看各个隔离级别的典型事务。
各个隔离级别分别适用于特定类型的任务。
以下信息可以确定各个特定操作最适合使用哪个级别。
1.级别0的典型事务
涉及浏览或输入数据的事务可能需要几分钟时间才能完成,并且需要读取大量行。
如果使用隔离级别2或3,可能会降低并发性。
对于这类事务,通常使用隔离级别0或1。
例如,对于需要从数据库中读取大量信息以生成统计摘要的决策支持应用程序,即使读取到的几行数据以后被修改,可能也不会对其产生很大影响。
如果要求这样的应用程序使用较高的隔离级别,它可能会在大量数据上获取读锁定,从而导致其它应用程序无法写入数据。
2.级别1的典型事务
隔离级别1特别适合与游标一起使用,因为这种组合既可以确保游标稳定性,又不会大幅提高锁定需求。
SQLAnywhere通过较早释放在游标的当前行上获取的读锁定来实现这一优点。
在级别2和级别3上,这些锁定必须持续到事务结束以确保可重复的读取。
例如,通过游标更新存货量的事务特别适合使用这个级别,因为随着进货或卖出对存货量进行的每次调整都不会丢失,而这些频繁调整对其它事务的影响又可以降低到最小程度。
3.级别2的典型事务
处于隔离级别2时,其它事务不能更改符合您的条件的行。
因此,如果必须多次读取行并且需要第一个结果集中包含的行不会更改,则可以使用这个级别。
由于需要相对较大数量的读锁定,因此使用这个隔离级别时应谨慎。
与级别3的事务一样,仔细设计数据库和索引可以减少获取的锁数目,从而大大提高数据库的性能。
4.级别3的典型事务
隔离级别3适合于将安全性放在首位的事务。
由于消除了幻像行,因此可以对行集放心地执行多步操作,而不必担心在操作过程中因出现新行导致结果损坏。
虽然隔离级别3可以提供很高的完整性,但在需要支持大量并发事务的大型系统中应谨慎使用。
SQLAnywhere在这一级别上放置的锁数目比任何其它级别都多,因此也增大了一个事务阻碍众多其它事务进程的可能性。
5.提高隔离级别2和3的并发性
隔离级别2和3使用大量锁定,因此,对于经常使用这些隔离级别的数据库而言,优良的设计非常重要。
如果必须使用可序列化事务,设计数据库时,特别是在设计索引时,应牢记项目的业务规则,这一点非常重要。
还可以将大事务分割成几个较小的事务,从而缩短锁定行的时间,这样便可提高性能。
虽然可序列化事务最有可能阻塞其它事务,但其效率并不一定低。
处理这些事务时,SQLAnywhere可以执行某些优化。
虽然增加了锁数目,但这些优化可能仍会使性能得到提高。
例如,由于无论是否符合搜索条件,所有读取的行都必须被锁定,因此数据库服务器可以自由地合并读取行的操作和放置锁的操作。
2.锁信息
(1)查看Syabse数据库使用的各种类型的锁、锁的持续时间。
Sybase数据库系统两个级别的锁机制:
所有页锁、数据页锁。
所有页锁在当数据库加锁时,既锁数据页,也锁索引页;数据页锁当数据库加锁时,只锁数据页,不锁索引页。
Sybase支持三种类型的锁:
数据表锁、数据页锁、数据行锁。
一些常用的调优命令和策略如下:
sp_configure"numberoflocks",50000(设置锁的数量)
系统设置时要把锁的数量设大一点,简单说就是要管够;如果需要节省空间,减少维护量,使用所有页锁机制;而如果需要加快速度,空间足够,使用数据页锁机制。
sp_sysmon“00:
10:
00”,locks(检测表的使用情况)
当通过监测发现锁竞争超过15%时,首先修改加锁最重的表的锁机制,然后再把数据页锁设置为数据行锁。
如果发现螺旋锁多,则为该表建立单独的命名缓存并对命名缓存进行分区。
(2)隔离级别与锁的关系
根据选择的隔离级别,数据库服务器将使用锁类型中的一些或全部来保持所要求的一致性等级。
SQLAnywhere根据需要使用模式锁、行锁、表锁和位置锁来确保所要求的一致性级别,不需要显式请求使用某个特定的锁定。
而应通过选择最符合要求的隔离级别来控制所维护的一致性级别。
了解各种锁类型有助于选择隔离级别和理解各个级别对性能的影响。
3.设计2个带有冲突操作的并发事务,由2个不同用户通过InteractiveSQL启动,并分别设置不同的隔离级别(可参考SAS10.0技术文档中“隔离级别教程”中的第1、2、3个例子)
2个用户分别启动在InteractiveSQL中各自的事务,观察事务的执行情况:
settransactionisolationlevel1
这个是两个用户各自执行自己的语句时的执行情况。
速度稍慢。
(1)使用sp_lock系统过程列出有关数据库中保留的锁的信息。
详细信息参见sp_lock系统过程。
在sa中查看锁信息:
在U1中查看锁信息:
(2)也可以在SybaseCentral中查看锁。
在左窗格中选择数据库,然后右窗格中会出现名为[表锁]的选项卡。
这个选项卡会显示每个锁的连接ID、用户ID、表名、锁类型和锁名。
在SybaseCentral中查看锁:
三、实验总结
1.在本次实验中,由于SybaseASE15.0版本问题,我们的命令执行时会遇到编译不过的问题。
在通过查证资料和自助学习等的实践,找到了开启和关闭自动提交事务的命令:
setchainedoff/on,然后才解决了这一问题。
2.在执行事务的时候,由于在语法里要设置savepoint后面+名字,但单独使用savepoint做关键字时也可以成功,但在一些特定的情况下就会出问题。
后来改为严格的语法规则后,就可以正常使用。
3.关于隔离级别隔离级别在本次实验中的要求体现并不是太明显,后来看书后才知道,事务的执行时的数据锁会和隔离级别有关,因此对隔离级别有了更深的印象。
通过选用不同的隔离等级就可以在不同程度上避免前面所提及的在事务处理中所面临的各种问题。
所以,数据库隔离级别的选取就显得尤为重要。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 事务 创建 运行