事務是作為單個邏輯單元執行的一系列操作,它是乙個不可分割的工作邏輯單元。它包含了一組資料庫操作命令,這組命令要麼全部執行,要麼全部不執行。
舉個例子,我們經常用到的 atm 訪問款機,比如轉賬的時候,是先減去轉出賬戶的金額,然後再在指定轉入賬戶的金額加上轉出的金額。如果剛好這個時候轉出的操作已經執行完成,但是由於系統的故障,導致轉入的操作失敗了。那麼怎麼辦?這就需要用到事務了,只要事務裡面有一條命令未成功執行,那麼資料就會回滾到事務開始之前的狀態。
原子性(atomicity)
事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。
事務在執行過程中發生錯誤,會被回滾(rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性(consistency)
事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。
乙個事務可以封裝狀態改變(除非它是乙個唯讀的)。事務必須始終保持系統處於一致的狀態,不管在任何給定的時間併發事務有多少。
也就是說:如果事務是併發多個,系統也必須如同序列事務一樣操作。其主要特徵是保護性和不變性(preserving an invariant).
以轉賬案例為例,假設有五個賬戶,每個賬戶餘額是100元,那麼五個賬戶總額是500元,如果在這個5個賬戶之間同時發生多個轉賬,無論併發多少個,
比如在a與b賬戶之間轉賬5元,在c與d賬戶之間轉賬10元,在b與e之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性.
隔離性(isolation)
乙個事務的執行不能被其他事務干擾。隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,執行在相同的時間內,
執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,
必須序列化或序列化請求,使得在同一時間僅有乙個請求用於同一資料。
持續性/永久性(durability)
乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的,不會被回滾。
customers表
列名資料型別
idint
name
nvarchar(50)
remain
decimal(18, 2)
用事務進行轉賬處理
select
*from customers
go--定義乙個變數,記錄錯誤數
declare
@error_nums
intset
@error_nums=0
--開始事務
begin
transaction tran_change
begin try
update customers set remain=remain-
200where id=
1set
@error_nums
=@error_nums
+@@error
update customers set remain=remain-
200where id=
2set
@error_nums
=@error_nums
+@@error
end try
begin catch
set@error_nums
=@error_nums+1
print
'錯誤異常:'
+convert
(varchar
,error_number())
+',錯誤資訊'
+convert
(varchar
,error_message())
end catchif(
@error_nums
>0)
--表示前面有錯誤
rollback
tran tran_change --回滾事務
else
commit
tran tran_change --執行事務
學習事務筆記
事務 transaction 其實指的一組操作,裡面包含許多個單一的邏輯。只要有乙個邏輯沒有執行成功,那麼都算失敗。所有的資料都回歸到最初的狀態 回滾 為什麼要有事務?為了確保邏輯的成功。例子 銀行的轉賬。指的是 事務中包含的邏輯,不可分割。指的是 事務執行前後。資料完整性 指的是 事務在執行期間不...
事務 學習筆記
講解事務前我們先來看一張圖 這張圖講述了資料庫的隔離級別和預防髒讀 不可重複讀,幻讀的對應關係。那麼mysql 預設的資料庫隔離級別是repeatable read 這個級別下就不會出現髒讀和不可重複讀。而oracle和sqlserver 的預設隔離級別是 read committed 這種級別不會...
sqlserver學習筆記
1.從乙個已經存在的表複製出乙個新錶 要求該錶不存在 select into time pense from time pensetemp 從time pensetemp表中複製time pense表 2.sql查詢表中的所有約束 exec sp helpconstraint objname 表名 ...