學習筆記----SQL Server事務

概述

事務主要用於處理操作量大,複雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。

  1. 原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

  2. 一致性:在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續數據庫可以自發性地完成預定的工作。

  3. 隔離性:數據庫允許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致。事務隔離分爲不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。

  4. 持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。

操作:

  1. begin transaction:開始事務。

  2. commit transaction:提交事務。

  3. rollback transaction:回滾事務。

  4. save transaction:事務保存點。即事務回滾時,可以指定回滾到保存點,而不進行全部回滾。

分類:

  1. 顯式事務:用 begin transaction 明確指定事務的開始,由 commit transaction 提交事務、rollback transaction 回滾事務到事務結束。

  2. 隱式事務:通過設置 set implicit_transactions on 語句,將隱式事務模式設置爲打開。當以隱式事務模式操作時,不必使用 begin transaction 開啓事務,當一個事務結束後,這個模式會自動啓用下一個事務,只需使用 commit transaction 提交事務或 Rollback Transaction 回滾事務即可。

  3. 自動提交事務: 這是 SQL Server 的默認模式,它將每條單獨的 T-SQL 語句視爲一個事務。如果成功執行,則自動提交。如果錯誤,則自動回滾。

使用場景

如果我們在執行一組SQL語句,希望其中任何一個環節出了問題,那麼所有執行全部撤銷,這個時候就用事務。

練習例子

我們模擬一個用戶轉賬的需求,如果A向B轉賬,如果A這邊轉賬出了問題,那麼B的餘額也不會增加
建立一張表作爲練習例子

字段 字段類型 字段含義
ID int
Name nvarchar(50)
Remain decimal(18, 2) 用戶餘額

我們希望,在用戶轉賬時,假如餘額不足則不允許轉賬,當收款人的餘額大於2000時則不允許在增加
對Remain字段約束:
在這裏插入圖片描述
在這裏插入圖片描述

go

--定義變量記錄錯誤數量
declare @error_nums int
set @error_nums=0
--開始事務
begin transaction tran_change
begin try
update [dbo].[Customer] set Remain=Remain-100 where name='劉虹伶'
set @error_nums=@error_nums+@@error
update [dbo].[Customer] set Remain=Remain+100 where name='郭方龍'
set @error_nums=@error_nums+@@error
end try
begin catch
set @error_nums=@error_nums+1
print '錯誤異常'+convert(varchar(50),error_number()) +'錯誤消息'+error_message()
end catch
if(@error_nums>0)--表示有錯,回滾
rollback transaction tran_change
else
 commit transaction tran_change

 select * from [dbo].[Customer]

上面的數據我們都是寫死的,有存儲過程基礎的小夥伴也可以把這個事務封裝成存儲過程,如果沒有存儲過程基礎的小夥伴也可以看看我之前的描寫存儲過程的文章:https://blog.csdn.net/qq_40052237/article/details/106258732

go
create proc cp_changeAcount
(
@idOut int,
@idIn int,
@Remain decimal(18,2)
)
as
--定義變量記錄錯誤數量
declare @error_nums int
set @error_nums=0
--開始事務
begin transaction tran_change
begin try
update [dbo].[Customer] set Remain=(Remain-@Remain) where id=@idOut
set @error_nums=@error_nums+@@error
update [dbo].[Customer] set Remain=(Remain+@Remain) where id=@idIn
set @error_nums=@error_nums+@@error
end try
begin catch
set @error_nums=@error_nums+1
print '錯誤異常:'+convert(varchar(50),error_number()) +'錯誤消息:'+error_message()
end catch
if(@error_nums>0)--表示有錯,回滾
rollback transaction tran_change
else
 commit transaction tran_change

這樣在我們調用的時候,數據可以根據前端傳來的值而改變

exec cp_changeAcount 1,2,100
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章