標籤:
指訪問並可能更新資料庫中各種資料項目的一個程式執行單元(unit)由多個sql語句組成,必須作為一個整體執行
這些sql語句作為一個整體一起向系統提交,要麼都執行、要麼都不執行
文法步驟:
開始事務:BEGIN TRANSACTION --開啟事務
事務提交:COMMIT TRANSACTION --提交操作
交易回復:ROLLBACK TRANSACTION --取消操作
--建表CREATE TABLE [Person]([PersonId] NVARCHAR(100) PRIMARY KEY , ---主鍵[PersonName] NVARCHAR(100) NULL)
/* 如果只有Begin TransAction和Commit TransAction 就算報錯了,也是不會復原的 Select * From Person*/Begin TransAction Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) Insert Into Person(PersonId,PersonName)Values(‘3‘,‘Name3‘)Commit TransAction/* 如果只有Begin TransAction和RollBack TransAction 就算沒報錯了,還是會復原的 Select * From Person*/--清除資料Delete PersonBegin TransAction Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) Insert Into Person(PersonId,PersonName)Values(‘3‘,‘Name3‘)RollBack TransAction/* SET XACT_ABORT ON時,在事務中,若出現錯誤,系統即預設復原事務,但只對非自訂錯誤有效 SET XACT_ABORT OFF,預設值,在事務中,復原一個語句還是整個事務視錯誤的嚴重程式而定, 使用者級錯誤一般不會復原整個事務 Select * From Person*/SET XACT_ABORT ON -- 開啟Begin TransAction Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) Insert Into Person(PersonId,PersonName)Values(‘3‘,‘Name3‘)Commit TransActionSET XACT_ABORT OFF -- 關閉/* Try Catch 配合事務使用 Select * From Person*/Begin Try Begin TransAction Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) Insert Into Person(PersonId,PersonName)Values(‘3‘,‘Name3‘) Commit TransActionEnd TryBegin Catch Rollback TransActionEnd Catch/* 使用全域變數@@Error 配合事務使用 Select * From Person*/DECLARE @tran_error int;SET @tran_error = 0; Begin TransAction Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) SET @tran_error = @tran_error + @@ERROR; print(@tran_error); Insert Into Person(PersonId,PersonName)Values(‘1‘,‘Name1‘) SET @tran_error = @tran_error + @@ERROR; print(@tran_error); Insert Into Person(PersonId,PersonName)Values(‘3‘,‘Name3‘) SET @tran_error = @tran_error + @@ERROR; print(@tran_error);IF(@tran_error > 0) BEGIN --執行出錯,復原事務 ROLLBACK TransAction; ENDELSE BEGIN --沒有異常,提交事務 COMMIT TransAction; END
SQLServer事務