事務概念
事務就是被綁定在一起作爲一個邏輯工作單元的SQL語句組,如果任何一個語句操作失敗那麼整個操作就被失敗,進而回滾到操作前狀態,或者是上個節點。
事務是作爲單個工作單元而執行的一系列操作,比如查詢和修改數據等。
事務的ACID特性
原子性(Atomicity):事務的原子性是指一個事務中包含的一條語句或者多條語句構成了一個完整的邏輯單元,這個邏輯單元具有不可再分的原子性。這個邏輯單元要麼一起提交執行全部成功,要麼一起提交執行全部失敗。
一致性(Consistency):可以理解爲數據的完整性,事務的提交要確保在數據庫上的操作沒有破壞數據的完整性,比如說不要違背一些約束的數據插入或者修改行爲。一旦破壞了數據的完整性,SQL Server 會回滾這個事務來確保數據庫中的數據是一致的。
隔離性(Isolation):與數據庫中的事務隔離級別以及鎖相關,多個用戶可以對同一數據併發訪問而又不破壞數據的正確性和完整性。但是,並行事務的修改必須與其它並行事務的修改相互獨立,隔離。 但是在不同的隔離級別下,事務的讀取操作可能得到的結果是不同的。
持久性(Durability):數據持久化,事務一旦對數據的操作完成並提交後,數據修改就已經完成,即使服務重啓這些數據也不會改變。相反,如果在事務的執行過程中,系統服務崩潰或者重啓,那麼事務所有的操作就會被回滾,即回到事務操作之前的狀態。
如何定義事務
(1)顯示定義:以BEGIN TRAN開始,提交的話則COMMIT提交事務,否則以ROLLBACK回滾事務。
--定義事務
BEGIN TRAN;
INSERT INTO dbo.T1(keycol, col1, col2) VALUES(4,101,'C');
INSERT INTO dbo.T1(keycol, col1, col2) VALUES(4,201,'X');
COMMIT TRAN;
(2)隱式定義:SQL Server中默認把每個單獨的語句作爲一個事務。
換句話說,SQL Server默認在執行完每個語句之後就自動提交事務。當然,我們可以通過IMPLICIT_TRANSACTIONS會話選項來改變SQL Server處理默認事務的方式,該選項默認情況下是OFF。如果將其設置爲ON,那麼就不必用BEGIN TRAN語句來表明事務開始,但仍然需要以COMMIT或ROLLBACK來標明事務完成。
事務案例
1.先創建一個Users表
2.語句
--小勇轉賬200給小敏
go
--定義一個變量,記錄錯誤數
declare @error_nums int
set @error_nums=0
--開始事務
begin transaction tran_change
begin try
update Users set Remain=Remain-200 where id=1
set @error_nums=@error_nums+@@ERROR
update Users set Remain=Remain+200 where id=2
set @error_nums=@error_nums+@@ERROR
end try
begin catch
set @error_nums=@error_nums+1
print '錯誤異常:'+convert(varchar,error_number())+',錯誤消息'+error_message()
end catch
if(@error_nums>0) --表示前面有錯
rollback transaction tran_change --回滾事務
else
commit transaction tran_change --執行事務
3.查詢一下看執行結果
select * from Users