《数据库》课件第8章-事务的概念及创建_第1页
《数据库》课件第8章-事务的概念及创建_第2页
《数据库》课件第8章-事务的概念及创建_第3页
《数据库》课件第8章-事务的概念及创建_第4页
《数据库》课件第8章-事务的概念及创建_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1回顾带有输出参数的存储过程存储过程调用存储过程2思考:写一个存储过程执行银行转账的功能,假设数据库中有账户表Account(UserName,UserAccount),现要将用户A转账到用户B一定的金额,完成存储过程。createprocprcTransfer@OriginUservarchar(20),@DesUservarchar(20),@MoneymoneyAs…

if(selectUserAccountfromAccount whereUserName=@OriginUser)>=@Money

begin updateAccountsetUserAccount=UserAccount-@Money whereUserName=@OriginUser updateAccountSetUserAccount=UserAccount+@Money whereUserName=@DesUser

end...假设程序执行到第一个更新语句时断电了?3第七章

事务的概念及创建4目标事务的概念创建包含事务的存储过程保存部分事务58.1事务的概念及应用

SQLServer提供了一种叫做事务的机制,它可以保证指定的对数据库的一系列操作作为一个整体被执行,在最终提交操作之间,用户可以随时取消前面的操作,将数据库还原到没有执行操作前的状态,或者操作全部完成,将所有的操作提交到数据库。6事务的属性

原子性:事务必须是原子工作单元。它对数据库所进行的操作,要么全都执行,要么全都不执行。

一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(B数索引)都必须是正确的。

隔离性:由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。78.2事务的操作启动事务:

BEGINTRANSACTION[事务名]回滚事务:

ROLLBACKTRANSACTION[事务名]提交事务:

COMMITTRANSACTION[事务名]注意,不能在发出COMMITTRANSACTION语句之后回滚事务,因为数据修改已经成为数据库的永久部分。8示例:定义一个事务,向“学生”表中插入两条记录。其中,第1条INSERT语句是正确的,而第2条INSERT语句是错误的。执行此事务语句后,查看“学生”表中的数据,确认第1条语句没有被执行。

解决方案:createprocprcInsertStudentasbegintrybegintransactionINSERTINTOStudentVALUES('A00010',‘Andy',21,'男','Nanjing',90,1)INSERTINTOStudentVALUES(‘A00011’,‘mary’,21,'女','Nanjing',150,1)committransactionendtrybegincatch print'出错了'endcatch思考:编译器执行到第二个insert语句时,会如何处理?Rollbacktransaction98.3包含事务的存储过程结构CREATEPROC存储过程名@参数名参数类型[,…n]ASBEGINTRY IFEXISTS() BEGIN BEGINTRANSACTION //执行事务语句 COMMITTRANSACTION END ELSE //信息不存在ENDTRYBEGINCATCH ROLLBACKTRANSACTIONENDCATCH10习题创建事务,假设给定学号的学生将从原系转入给定的系,则相应的系总人数将发生变化,如果两系相差人数小于10,则允许该生转系,否则回滚事务。假设系表Department(DepID,DepName,Total)解决方案:①求出给定学号对应的原系号②求出给定转入的系名对应的系号③更新学生表中该学号对应的新系号④将系表中原系号对应的总人数-1⑤将系表中转入的系号对应的总人数+1⑥获取原系号对应的人数⑦获取新系号对应的人数⑧如果人数相差<=10,则提交事务;否则回滚事务。11程序createprocprcTransfer@StuIDchar(10),@DepNamevarchar(40)As…IFEXISTS(SELECT*FROMStudentWHEREStuID=@StuID)IFEXISTS(SELECT*FROMDepartmentWHEREDepName=@DepName)begin

begintran

declare@OrginalDepint,@NewDepint

select@OrginalDep=DepIDfromstudentwhereStuID=@StuID

select@NewDep=DepIDfromdepartmentwhereDepName=@DepName

updatestudentsetDepID=@NewDepwhereStuID=@StuID

updateDepartmentsetTotal=Total+1whereDepName=@DepName

updateDepartmentsetTotal=Total-1whereDepID=@OrginalDep

declare@OrginalTotalint,

@NewTotalint

select@OrginalTotal=TotalfromdepartmentwhereDepID=@OrginalDep

select@NewTotal=TotalfromdepartmentwhereDepID=@NewDep

if(@OrginalTotal-@NewTotal>=-10and@OrginalTotal-@NewTotal<=10)

committran

else

rollbacktran

end…12回滚事务的一部分SC表和Department表需要用下面的事务来更新:操作1:UPDATESCSETScore=Score+1WHEREStuID=‘A00001’andCourseID=1UPDATESCSETScore=Score-1WHEREStuID=‘A00001’andCourseID=

2操作2:INSERTINTOSTUDENTVALUES('A00014','mary',21,'男','Nanjing',90,2)UPDATEDepartmentSETTotal=Total+1WHEREDepID=213思考所有更新应一起来做。对于Department,如果Total值大于100,由第二个事务所产生的改变必须被回滚,而由第一个事务产生的改变是允许的。148.4设置事务保存点在事务内设置保存点。保存点把事务分成几个逻辑单元,如果事务的一部分是有条件地被取消,这样事务可以返回到保存点。语法:SAVETRAN[SACTION]{savepoint_name}15解决方案BEGINTRANSACTION

UPDATESCSETScore=Score+1WHEREStuID=‘A00001’andCourseID=1UPDATESCSETScore=Score-1WHEREStuID=‘A00001’andCourseID=

2SAVETRANSACTIONtrnTransaction1INSERTINTOSTUDENTVALUES('A00014','mary',21,'男','Nanjing',90,2)UPDATEDepartmentSETTotal=Total

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论