SQL 事務(Transaction)


1、概念

指訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)由多個sql語句組成,必須作為一個整體執行
這些sql語句作為一個整體一起向系統提交,要么都執行、要么都不執行

語法步驟:
開始事務:BEGIN TRANSACTION --開啟事務
事務提交:COMMIT TRANSACTION --提交操作
事務回滾:ROLLBACK TRANSACTION --取消操作

 

2、建表

--建表
CREATE TABLE [Person](
[PersonId]    NVARCHAR(100) PRIMARY KEY ,        ---主鍵
[PersonName] NVARCHAR(100) NULL
)

 

 

3、事務

/*
    如果只有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 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')
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 TransAction
SET 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 TransAction
End Try
Begin Catch
    Rollback TransAction
End 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;
    END
ELSE
    BEGIN
        --沒有異常,提交事務
        COMMIT TransAction;
    END

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM