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 masterCREATE TABLE student
(
stuid INT NOT NULL PRIMARY KEY,
stuname VARCHAR(50)
)
CREATE TABLE score
(
stuid INT NOT NULL REFERENCES student(stuid),
score INT
)
如下示例不太恰當, 但正確使用了事務?
begin tranINSERT 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.
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 OFFBEGIN 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出“事務回滾”, 錯誤信息為:
| ErrorNumber | ErrorSeverity | ErrorState | ErrorMessage |
| 547 | 16 | 0 | INSERT 語句與 FOREIGN KEY 約束"FK__score__stuid__5C37ACAD"沖突。該沖突發生于數據庫"master",表"dbo.student", column 'stuid'。 |
轉載于:https://www.cnblogs.com/buguge/archive/2012/03/08/2385477.html
總結
以上是生活随笔為你收集整理的t-sql中的事务控制及错误处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用委托实现窗体间传值
- 下一篇: Spoken English(015)