SQL-事務管理

來自必知必會的實踐

事務處理 transaction processing

是一種機制,用來管理必須成批執行的SQL操作,保證一組操作不會中途停止。這組語句要麼完全執行,要麼完全不執行。如果沒有錯誤發生,整組語句的結果提交(寫入)數據庫表,否則,回滾(rollback),將數據庫恢復到某個已知且安全的狀態。
比如轉賬,自己銀行卡減少的同時,另一個銀行卡必須增加,不能中途錯誤導致一個減少另一個卻沒有增加,這組操作必須成批執行。

關鍵詞:
事務transaction:必須完整執行的語句塊
– 對何時寫數據,何時撤銷進行明確的管理:
回滾rollback:撤銷指定SQL語句的過程
提交commit:將未存儲的SQL語句結果寫入數據庫表。
一般的SQL語句直接操作了表,這是隱式提交,即執行完語句結果就自動提交到表了。事務處理塊中不是隱式提交,而進行明確的提交,使用COMMIT語句。
保留點savepoint:事務處理中設置的臨時佔位符,可以回滾到保留點。只可以回滾對數據的增刪改操作,不能回滾表的操作。
– 關鍵:將SQL語句分解爲邏輯塊,並明確規定何時應該回滾,回滾到哪裏

– SQLserver中以BEGIN TRANSACTION… COMMIT TRANSACTION標識事務處理塊的開始和結束,語句之間的SQL必須完全執行或完全不執行

-- 刪除訂單12345,涉及訂單表和訂單細節表,要同時刪除,
-- 因此使用事務處理塊保證訂單不被部分刪除
BEGIN TRANSACTION
DELETE OrderItems WHERE order_num=12345;
DELETE Orders WHERE order_num=12345;
COMMIT TRANSACTION     -- 僅在上面都不出錯時提交更改,若第一條成功,第二條失敗,則兩條都不會提交

– 使用保留點,更好的控制回退。因爲複雜事務需要部分提交或回滾,發生錯誤時只需要返回到出錯前一步,不需要回退到原點。
– 在事務處理塊的合適位置放佔位符,作爲回滾的地標,稱爲保留點。
– 設置保留點:SAVE TRANSACTION savePoint_name;
– 回滾到保留點:ROLLBACK TRANSACTION savePoint_name:

BEGIN TRANSACTION -- 開始事務處理
INSERT INTO Customers(cust_id,cust_name) VALUES('1000000010','Toys Emporium'); --增加一個顧客
SAVE TRANSACTION StartOrder;  -- 設置保留點爲開始訂單前的一步
 -- 增加該顧客的訂單
INSERT INTO Orders(order_num,order_date,cust_id) VALUES(20100,'2001/12/1','1000000010'); 
 -- 如果插入訂單表出錯(@@ERROR 錯誤數不爲0),回滾到保留點,沒有插入訂單表那一步
IF @@ERROR!=0 ROLLBACK TRANSACTION StartOrder;     
-- 如果插入訂單表未出錯,則將第一個物品插入訂單細節表
INSERT INTO OrderItems(order_num,order_item,prod_id,quantity,item_price) VALUES(20100,1,'BR01',100,5.49) 
-- 如果插入訂單細節表出錯(@@ERROR 錯誤數不爲0),回滾到保留點,沒有插入訂單表那一步
IF @@ERROR!=0 ROLLBACK TRANSACTION StartOrder;    
-- 如果插入訂單細節表未出錯,則將第二個物品插入訂單細節表  
INSERT INTO OrderItems(order_num,order_item,prod_id,quantity,item_price) VALUES(20100,2,'BR03',100,10.99) 
 -- 如果插入訂單細節表出錯(@@ERROR 錯誤數不爲0),回滾到保留點,沒有插入訂單表那一步
IF @@ERROR!=0 ROLLBACK TRANSACTION StartOrder;     
COMMIT TRANSACTION            -- 如果全未出錯,提交更改結果

– 該例中不能在插入訂單細節表之前設第二個保留點,因爲不允許有訂單卻沒有訂單物品,增加訂單和增加訂單物品是一個原子項,所以只設一個訂單表之前的保留點就行
– SQLserver中通過檢查名爲@@ERROR的變量看是否出錯,若爲0則成功
– 保留點越多越好,越靈活進行回退

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