數據庫事務:
數據庫事務(Database Transaction) 是指作為單個邏輯工作單元執行的一系列操作。
事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。
設想網上購物的一次交易,其付款過程至少包括以下幾步數據庫操作:
更新客戶所購商品的庫存信息
保存客戶付款信息--可能包括與銀行系統的交互
生成訂單並且保存到數據庫中 · 更新用戶相關信息,例如購物數量等等 正常的情況下,這些操作將順利進行,最終交易成功,與交易相關的所有數據庫信息也成功地更新。但是,如果在這一系列過程中任何一個環節出了差錯,例如在更新商品庫存信息時發生異常、該顧客銀行帳戶存款不足等,都將導致交易失敗。一旦交易失敗,數據庫中所有信息都必須保持交易前的狀態不變,比如最后一步更新用戶信息時失敗而導致交易失敗,那么必須保證這筆失敗的交易不影響數據庫的狀態--庫存信息沒有被更新、用戶也沒有付款,訂單也沒有生成。否則,數據庫的信息將會一片混亂而不可預測。
數據庫事務正是用來保證這種情況下交易的平穩性和可預測性的技術。
begin tran (或transaction) --開始事務
commit --提交事務
rollback --回滾事務
事務特性:
A原子性(atomicity)
C一致性(consistency)
I隔離性(isolation)
D持久性(durability)
@@ERROR 是判斷事務有沒有錯的條件,無錯時值為0,有錯時值不為0。
事務創建以及使用示例:
select * from cangku begin tran --開始事務 insert into cangku values(10008,'Boxster',70,10,1004)--沒有錯 if @@ERROR >0 begin--每一個執行語句后面寫這句話是為了如果上一句有錯誤, --下面不管有多少執行語句,都不會執行,直接到tranrollback goto tranrollback--到最后一個執行語句的tranrollback end insert into cangku values(10002,'極光',66.50,10,1002)--主鍵約束 if @@ERROR>0 goto tranrollback insert into cangku values(10009,'XF',40,10,1003)--沒有錯 if @@ERROR>0 begin tranrollback: --需要加上冒號 rollback tran --回滾所有事務中執行過的命令(撤銷所有執行語句) end else begin commit tran --提交事務(只有真正的走到了commit才是真正的更改數據庫的數據) end
練習:創建三個表並寫一個簡單的存儲過程,要求可以進貨、出貨並打印小票。
在沒有此貨物並且為進貨時,添加上這一行信息;
在沒有此貨物並且為出貨時,打印沒有此貨物!
下面開始執行語句:
語句一:進貨,編號為1001的貨物新增10個
語句二:編號為1001的貨物出貨5台
在每次為出貨並且數量夠的情況下,會打印小票
語句三:新進貨編號為1021
語句四:出貨,編號為1022的貨物出貨,但是倉庫中沒有此編號的貨物