日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

t-sql中的事务控制及错误处理

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 t-sql中的事务控制及错误处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

------------------------------------------------事務控制-----------------------------------------------------

Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran來使用事務。
begin tran表示開始事務, commit tran表示提交事務,rollback tran表示回滾事務
begin tran 可以理解成新建一個還原點;
commit tran提交這個自begin tran開始的修改;
rollback tran 表示還原到上個還原點。

?

先創建工作表

USE master
CREATE TABLE student
(
stuid INT NOT NULL PRIMARY KEY,
stuname VARCHAR(50)
)
CREATE TABLE score
(
stuid INT NOT NULL REFERENCES student(stuid),
score INT
)

如下示例不太恰當, 但正確使用了事務?

begin tran

INSERT INTO student VALUES (101,'zhangsan')
INSERT INTO student VALUES (102,'wangwu')

INSERT INTO score VALUES (101,190)
INSERT INTO score VALUES (102,78)

if exists(select 1 from score where score>100)--如果有>100分的成績,則回滾整個事務
rollback
else
commit tran

因為事務里有插入分數為190(>100)的記錄, 所以整個事務回滾。

------------------------------------------------錯誤處理 Error Handling-----------------------------------------------------

對于運行時錯誤或異常呢?

先準備如下數據:

INSERT INTO student VALUES (101,'zhangsan')
INSERT INTO student VALUES (102,'wangwu')
INSERT INTO student VALUES (103,'lishi')
INSERT INTO student VALUES (104,'maliu')

?

--調用一個運行時錯誤
SET XACT_ABORT OFF
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107, 76) /* 外鍵錯誤 */
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN

執行如上sql,出現了運行時錯誤(外鍵沖突), 整個事務無法回滾

如果產生異常,則事務是不會回滾的, 此時要借助如下2種方法:

1)SET XACT_ABORT ON
SET XACT_ABORT ON時,在事務中,若出現錯誤,系統即默認回滾事務,但只對非自定義錯誤有效

SET XACT_ABORT OFF,默認值,在事務中,回滾一個語句還是整個事務視錯誤的嚴重程序而定,用戶級錯誤一般不會回滾整個事務
When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back.
The setting of SET XACT_ABORT is set at execute or run time and not at parse(從語法上分析;解析) time.

SET XACT_ABORT ON
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107, 76) /* 外鍵錯誤 */
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
SET XACT_ABORT OFF

執行后會拋出異常:

消息 547,級別 16,狀態 0,第 6 行
INSERT 語句與 FOREIGN KEY 約束"FK__score__stuid__5C37ACAD"沖突。該沖突發生于數據庫"master",表"dbo.student", column 'stuid'。

2)使用TRY...CATCH構造,并調用一個運行時錯誤

SET XACT_ABORT OFF
BEGIN TRY
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107, 76) /* 外鍵錯誤 */
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
PRINT '事務提交'
END TRY
BEGIN CATCH
ROLLBACK
PRINT '事務回滾'
SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_MESSAGE() as ErrorMessage;
END CATCH

此時,會print出“事務回滾”, 錯誤信息為:

ErrorNumberErrorSeverityErrorStateErrorMessage
547160INSERT 語句與 FOREIGN KEY 約束"FK__score__stuid__5C37ACAD"沖突。該沖突發生于數據庫"master",表"dbo.student", column 'stuid'。

轉載于:https://www.cnblogs.com/buguge/archive/2012/03/08/2385477.html

總結

以上是生活随笔為你收集整理的t-sql中的事务控制及错误处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。