您現在的位置是:首頁 > 單機遊戲首頁單機遊戲
Sql Server 事務 Transaction
- 2022-10-04
匹配樣本是什麼
說明
將若干條 SQL 語句“打包”在一起,共同執行一個完整的任務,就是事務。
事務由一條或者多條 SQL 語句構成。
事務有一個最顯著的特徵,就是它包含的所有 SQL 語句作為一個整體向資料庫提交,只有全部的 SQL 語句都執行完成,整個事務才算成功,一旦某個 SQL 語句執行失敗,整個事務就失敗了。事務失敗後需要回滾所有對資料庫所做的操作。
事務中的所有 SQL 語句是一個整體,要麼全部執行成功,要麼全部執行失敗。
——————————————-
常用流程
Begin Transaction:事務開始。
Commit Transaction:事務提交。
Rollback Transaction:回滾事務。
Save Transaction:事務儲存點。
Xact_Abort on/off : 是否回滾當前事務,為on時如果當前sql出錯,回滾整個事務,為off時如果sql出錯回滾當前sql語句,其它語句照常執行讀寫資料庫。
————————————————-
屬性
原子性
一個事務中的所有 SQL 語句,要麼全部執行成功,要麼全部執行失敗,不會結束在中間的某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性
在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,其中包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。
隔離性
資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(Serializable)。
永續性
事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。
常用全域性變數
常用全域性變數
示例
drop TABLE sal_order_testLog
drop TABLE sal_order_test
CREATE TABLE sal_order_test
(FID INT IDENTITY (1,1),
FBILLNO VARCHAR(200) NOT NULL DEFAULT(‘’),
FDATE VARCHAR(200) NOT NULL DEFAULT(‘’)
)
CREATE TABLE sal_order_testLog
(FID INT IDENTITY (1,1),
Direction VARCHAR(2000) NOT NULL DEFAULT(‘’),
FDATE VARCHAR(200) NOT NULL DEFAULT(‘’)
)
select *from sal_order_testLog
select *from sal_order_test
begin tran ——-開啟事務
——set xact_abort off
begin try
insert into sal_order_test (FBILLNO,FDATE) values (‘xsdd001’,CONVERT(varchar,GETDATE(),21))
save tran saveIndex ——加入儲存點
——insert into sal_order_test (FBILLNO,FDATE) values (CONVERT(int,0),GETDATE()) ——錯誤型別,出錯
end try
begin catch
select Error_number() as ErrorNumber, ——錯誤程式碼
Error_severity() as ErrorSeverity, ——錯誤嚴重級別,級別小於10 try catch 捕獲不到
Error_state() as ErrorState , ——錯誤狀態碼
Error_Procedure() as ErrorProcedure , ——出現錯誤的儲存過程或觸發器的名稱。
Error_line() as ErrorLine, ——發生錯誤的行號
Error_message() as ErrorMessage ——錯誤的具體資訊
if(@@trancount>0) ——全域性變數@@trancount,事務開啟此值+1,他用來判斷是有開啟事務
rollback tran
end catch
if(@@trancount>0)
rollback tran saveIndex ——回滾到儲存點
if(@@ERROR>0) ——全域性變數@@ERROR,判斷錯誤
begin
rollback tran ——事務回滾
insert into sal_order_testLog (Direction,FDATE) select ‘執行失敗’,CONVERT(varchar,GETDATE(),21) ——寫入日誌
end
else
begin
commit tran ——提交事務
insert into sal_order_testLog (Direction,FDATE) select ‘執行成功’,CONVERT(varchar,GETDATE(),21) ——寫入日誌
end
go
——表本身為空表,ID ,FDATE為int 型別,其它為nvarchar型別
select * from sal_order_test
select * from sal_order_testLog
select @@LANGUAGE as ‘當前使用語言’
select @@SERVERNAME as ‘當前伺服器名稱’
select @@TRANCOUNT as ‘當前連線開啟的事務數’
select @@MAX_CONNECTIONS as ‘可以同時連線的最大數目’
select @@VERSION as ‘當前伺服器版本’
select @@ERROR as ‘最後一個T-SQL錯誤的錯誤號’