数据库删除事务流程.docx_第1页
数据库删除事务流程.docx_第2页
数据库删除事务流程.docx_第3页
数据库删除事务流程.docx_第4页
数据库删除事务流程.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

代码:ALTER proc dbo.DeletedGroupGroupID intASBEGINDECLARE TranStarted int SET TranStarted = 0IF(TRANCOUNT = 0)BEGINBEGIN TRANSACTIONSET TranStarted = 1 ENDELSESET TranStarted = 0DECLARE ErrorCode int SET ErrorCode = 0IF EXISTS(SELECT * FROM PrizeGroup WHERE PrizeGroupID = GroupID AND IsApproved = 1 )BEGINRAISERROR(评审小组已批复通过,不可删除!,16,1)SET ErrorCode = -3GOTO CleanupENDIF EXISTS(SELECT * FROM PrizeGroupExpert WHERE PrizeGroupID = GroupID )BEGINDELETE PrizeGroupExpertWHERE PrizeGroupID = GroupIDENDIF EXISTS(SELECT * FROM Achievement WHERE PrizeGroupID = GroupID)BEGINUPDATE AchievementSET PrizeGroupID = NULLWHERE PrizeGroupID = GroupIDdelete from PrizeGroupAchievementwhere PrizeGroupID = GroupIDENDIF EXISTS(SELECT * FROM PrizeGroup WHERE PrizeGroupID = GroupID AND IsHistory = 0)BEGINDELETE FROM PrizeGroupWHERE PrizeGroupID = GroupIDENDIF(Error0)BEGINSET ErrorCode = -1GOTO Cleanup -这个东西就要写在操作之后,提交之前(个人理解,日后再确定一下) ENDIF(TranStarted = 1)BEGIN SET TranStarted = 0COMMIT TRANSACTIONENDRETURN 0Cleanup: -自定义的函数 需要返回(日后再看)IF(TranStarted = 1)BEGINSET TranStarted = 0ROLLBACK TRANSACTIONENDRETURN ErrorCodeEND心得:1:TRANCOUNT的用法在处理事务的时候,一般都用RollBack Transaction来回滚,但是如果在嵌套事务中这样使用的话,就会出现错误。在SqlServer里,嵌套事务的层次是由TranCount全局变量反映出来的。每一次Begin Transaction都会引起TranCount加1。而每一次Commit Transaction都会使TranCount减1,而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使TranCount置0。例如:Begin Transaction - TranCount = 1 BeginTransaction - TranCount = 2 BeginTransaction - TranCount = 3 Commit Transaction - TranCount = 2 Commit Transaction - TranCount = 1Commit Transaction - TranCount = 0如果出现错误ROLLBACK TRANSACTION 则:Begin Transaction - TranCount = 1 BeginTransaction - TranCount = 2 BeginTransaction - TranCount = 3 ROLLBACK TRANSACTION - TranCount = 0 Commit Transaction - TranCount = 0-出现错误Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0. 如果被嵌套的事务中发生错误,最简单的方法应该是无论如何都先将它提交,同时返回错误码(一个正常情况不可能出现的代码 如 -1)让上一层事务来处理这个错误,从而使TranCount 减1。 这样外层事务在回滚或者提交的时候能够保证外层事务在开始的时候和结束的时候保持一致。由于里层事务返回了错误码,因此外层事务(最外层)可以回滚事务,这样里面已经提交的事务也可以被回滚而不会出现错误。 在项目中应该会常常出现这样的情况,一个存储过程里面用了事务,但是不能保证它会被别的带有事务的存储过程调用,如果单独调用的话,出现错误可以直接回滚,但是如果是被别的带事务的存储过程调用的话,RollBack 就会出错了。因此需要一种机制来区分,建立一个临时的变量来区分是否嵌套,和嵌套的层数,如下:DECLARE TranCounter INT; SET TranCounter = TRANCOUNT; IF TranCounter 0 SAVE TRANSACTION ProcedureSave; ELSE BEGIN TRANSACTION;-事务内要执行的代码 IF ERROR0goto ErrorCommit TransactionCommit Transaction-下面返回要返回的值0只是个例子Return 0Error: IF TranCounter = 0 ROLLBACK TRANSACTION; Else ROLLBACK TRANSACTION ProcedureSave; Return Error2:RAISERROR(评审小组已批复通过,不可删除!,16,1)中 RAISERROR的用法raiserror 的作用: raiserror 是用于抛出一个错误。 其语法如下:RAISERROR(msg_id|msg_str|local_variable,severity,state,argument,.n)WITHoption,.n简要说明一下:第一个参数: msg_id | msg_str | local_variable msg_id:表示可以是一个sys.messages表中定义的消息代号; 使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。 用户定义错误消息的错误号应当大于 50000。 msg_str:表示也可以是一个用户定义消息,该错误消息最长可以有 2047 个字符; (如果是常量,请使用Nxxxx,因为是nvarchar的) 当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。 local_variable:表示也可以是按照 msg_str 方式的格式化字符串变量。 第二个参数:severity 用户定义的与该消息关联的严重级别。(这个很重要) 任何用户都可以指定 0 到 18 之间的严重级别。 0,10的闭区间内,不会跳到catch; 如果是11,19,则跳到catch; 如果20,无穷),则直接终止数据库连接;第三个参数:state 如果在多个位置引发相同的用户定义错误, 则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。 介于 1 至 127 之间的任意整数。(state 默认值为1) 当state 值为 0 或大于 127 时会生成错误!第四个参数:argument 用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。第五个参数:option 错误的自定义选项,可以是下表中的任一值: LOG :在错误日志和应用程序日志中记录错误; NOWAIT:将消息立即发送给客户端; SETERROR:将 ERROR 值和 ERROR_NUMBER 值设置为 msg_id 或 50000; SQL代码示例-示例1DECLAREraiseErrorCodenvarchar(50)SETraiseErrorCode=CONVERT(nvarchar(50),YOURUNIQUEIDENTIFIERKEY)RAISERROR(%sINVALIDID.Thereisnorecordintable,16,1,raiseErrorCode)-示例2RAISERROR(NThisismessage%s%d.,-Messagetext,10,-Severity,1,-State,Nnumber,-Firstargument.5-Secondargument.);-Themessagetextreturnedis:Thisismessagenumber5.GO-示例3RAISERROR(N,-Messagetext.10,-Severity,1,-State,7,-Firstargumentusedforwidth.3,-Secondargumentusedforprecision.Nabcde);-Thirdargumentsuppliesthestring.-Themessagetextreturnedis:.GO-示例4RAISERROR(N,-Messagetext.10,-Severity,1,-State,Nabcde);-Firstargumentsuppliesthestring.-Themessagetextreturnedis:.GO-示例5 -A. 从 CATCH 块返回错误消息以下代码示例显示如何在 TRY 块中使用 RAISERROR 使执行跳至关联的 CATCH 块中。它还显示如何使用 RAISERROR 返回有关调用 CATCH 块的错误的信息。BEGINTRYRAISERROR(ErrorraisedinTRYblock.,-Messagetext.16,-Severity.1-State.);ENDTRYBEGINCATCHDECLAREErrorMessageNVARCHAR(4000);DECLAREErrorSeverityINT;DECLAREErrorStateINT;SELECTErrorMessage=ERROR_MESSAGE(),ErrorSeverity=ERROR_SEVERITY(),ErrorState=ERROR_STATE();RAISERROR(ErrorMessage,-Messagetext.ErrorSeverity,-Severity.ErrorState-State.);ENDCATCH;-示例6-B. 在 sys.messages 中创建即席消息以下示例显示如何引发 sys.messages 目录视图中存储的消息。该消息通过 sp_addmessage 系统存储过程,以消息号50005添加到 sys.messages 目录视图中。sp_addmessagemsgnum=50005,severity=10,msgtext=N;GORAISERROR(50005,-Messageid.10,-Severity,1,-State,Nabcde);-Firstargumentsuppliesthestring.-Themessagetextreturnedis:.GOsp_dropmessagemsgnum=50005;GO-示例7-C. 使用局部变量提供消息文本以下代码示例

温馨提示

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

评论

0/150

提交评论