在SQL Server中,我常常會(huì)看到有些前輩這樣寫(xiě):
if ( @@error <> 0 ) ROLLBACK TRANSACTION T else COMMIT TRANSACTION T
一開(kāi)始,我看見(jiàn)別人這么寫(xiě),我就想當(dāng)然的以為它只是個(gè)計(jì)數(shù)器,每當(dāng)檢測(cè)到一處錯(cuò)誤時(shí),@@error的值+1,不過(guò)就因?yàn)檫@個(gè)理所當(dāng)然,所以杯具了...
實(shí)際上,它并不是一個(gè)計(jì)數(shù)器,它是一個(gè)動(dòng)態(tài)的值,動(dòng)態(tài)的標(biāo)識(shí)最后一條SQL命令執(zhí)行的結(jié)果,如果成功則為0,不成功則標(biāo)識(shí)錯(cuò)誤碼。所以,像上面這種寫(xiě)法是不妥的,舉個(gè)例子,如下:
SET NOCOUNT ON ; SET XACT_ABORT ON ; -- 執(zhí)行 Transact-SQL 語(yǔ)句產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,則整個(gè)事務(wù)將終止并回滾 BEGIN TRANSACTION T UPDATE Test SET a = ' 已更新 ' WHERE a = ' 未更新 ' RAISERROR ( ' 不好意思,你沒(méi)有權(quán)限! ' , 16 , 1 )
SELECT GETDATE () if ( @@error <> 0 ) ROLLBACK TRANSACTION T else COMMIT TRANSACTION T
分析:
按我以前的理解來(lái)說(shuō),【?RAISERROR ('不好意思,你沒(méi)有權(quán)限!',16,1)?】這里拋出了一個(gè)錯(cuò)誤,整個(gè)事務(wù)應(yīng)該回滾才對(duì),可是,它卻沒(méi)有回滾!!那么原因出在哪呢?原來(lái),問(wèn)題出在"SELECT GETDATE()"這句上面!因?yàn)閳?zhí)行 RAISERROR 語(yǔ)句時(shí),@@error的值不為0(好像是5000),而當(dāng)執(zhí)行到下一句"SELECT GETDATE()"時(shí),@@error的值又變?yōu)?了!所以,后面的if語(yǔ)句自然沒(méi)有捕捉到任何錯(cuò)誤...
?
對(duì)策:
既然找到了原因,那解決辦法自然也少不了。用Try...CATCH語(yǔ)法就可以了,語(yǔ)句如下:
SET NOCOUNT ON ; SET XACT_ABORT ON ; -- 執(zhí)行 Transact-SQL 語(yǔ)句產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,則整個(gè)事務(wù)將終止并回滾 BEGIN TRY BEGIN TRANSACTION T UPDATE Test SET a = ' 已更新 ' WHERE a = ' 未更新 ' RAISERROR ( ' 不好意思,你沒(méi)有權(quán)限! ' , 16 , 1 ) SELECT GETDATE () COMMIT TRANSACTION T END TRY BEGIN CATCH DECLARE @msg nvarchar ( 2000 ) = ERROR_MESSAGE() -- 將捕捉到的錯(cuò)誤信息存在變量@msg中 RAISERROR ( @msg , 16 , 1 ) -- 此處才能拋出(好像是這樣子....) ROLLBACK TRANSACTION T -- 出錯(cuò)回滾事務(wù) END CATCH
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
