欢迎来到天天文库
浏览记录
ID:34772585
大小:55.76 KB
页数:9页
时间:2019-03-10
《数据库删除事务流程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、代码:ALTERproc[dbo].[DeletedGroup]@GroupIDintASBEGINDECLARE@TranStartedintSET@TranStarted=0IF(@@TRANCOUNT=0)BEGINBEGINTRANSACTIONSET@TranStarted=1ENDELSESET@TranStarted=0DECLARE@ErrorCodeintSET@ErrorCode=0IFEXISTS(SELECT*FROMPrizeGroupWHEREPrizeGroupID=@GroupIDANDIsApproved=1)B
2、EGINRAISERROR('评审小组已批复通过,不可删除!',16,1)SET@ErrorCode=-3GOTOCleanupENDIFEXISTS(SELECT*FROMPrizeGroupExpertWHEREPrizeGroupID=@GroupID)BEGINDELETEPrizeGroupExpertWHEREPrizeGroupID=@GroupIDENDIFEXISTS(SELECT*FROMAchievementWHEREPrizeGroupID=@GroupID)BEGINUPDATEAchievementSETPrizeGr
3、oupID=NULLWHEREPrizeGroupID=@GroupIDdeletefromPrizeGroupAchievementwherePrizeGroupID=@GroupIDENDIFEXISTS(SELECT*FROMPrizeGroupWHEREPrizeGroupID=@GroupIDANDIsHistory=0)BEGINDELETEFROMPrizeGroupWHEREPrizeGroupID=@GroupIDENDIF(@@Error<>0)BEGINSET@ErrorCode=-1GOTOCleanup--这个东西就要写
4、在操作之后,提交之前(个人理解,日后再确定一下)ENDIF(@TranStarted=1)BEGINSET@TranStarted=0COMMITTRANSACTIONENDRETURN0Cleanup:--自定义的函数需要返回(日后再看)IF(@TranStarted=1)BEGINSET@TranStarted=0ROLLBACKTRANSACTIONENDRETURN@ErrorCodeEND心得:1:@@TRANCOUNT的用法在处理事务的时候,一般都用RollBackTransaction来回滚,但是如果在嵌套事务中这样使用的话,就会出
5、现错误。在SqlServer里,嵌套事务的层次是由@@TranCount全局变量反映出来的。每一次BeginTransaction都会引起@@TranCount加1。而每一次CommitTransaction都会使@@TranCount减1,而RollBackTransaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使@@TranCount置0。例如:BeginTransaction--@@TranCount=1BeginTransaction--@@TranCount=2BeginTransaction--@@TranCou
6、nt=3CommitTransaction--@@TranCount=2CommitTransaction--@@TranCount=1CommitTransaction--@@TranCount=0如果出现错误ROLLBACKTRANSACTION则:BeginTransaction--@@TranCount=1BeginTransaction--@@TranCount=2BeginTransaction--@@TranCount=3ROLLBACKTRANSACTION--@@TranCount=0CommitTransaction--@@T
7、ranCount=0---出现错误TransactioncountafterEXECUTEindicatesthataCOMMITorROLLBACKTRANSACTIONstatementismissing.Previouscount=1,currentcount=0.如果被嵌套的事务中发生错误,最简单的方法应该是无论如何都先将它提交,同时返回错误码(一个正常情况不可能出现的代码如-1)让上一层事务来处理这个错误,从而使@@TranCount减1。这样外层事务在回滚或者提交的时候能够保证外层事务在开始的时候和结束的时候保持一致。由于里层事务返回
8、了错误码,因此外层事务(最外层)可以回滚事务,这样里面已经提交的事务也可以被回滚而不会出现错误。在项目中应该会常常出现这样的情况,一个存
此文档下载收益归作者所有