11.4.1 事務(wù)的由來
使用DELETE 命令或UPDATE 命令對數(shù)據(jù)庫進行更新時一次只能操作一個表,這會帶來數(shù)據(jù)庫的數(shù)據(jù)不一致的問題。例如:企業(yè)取消了后勤部,需要將‘后勤部’從department表中刪除,要修改department 表,而employee 表中的部門編號與后勤部相對應(yīng)的員工也應(yīng)刪除。因此,兩個表都需要修,改這種修改只能通過兩條DELETE 語句進行。假設(shè)后勤部編號為‘1012’
第一條DELETE 語句修改department 表 delete from department where dept_id = ’1012’ 第二條DELETE 語句修改employee 表 delete from employee where dept_id = ’1012’
在執(zhí)行第一條DELETE 語句后,數(shù)據(jù)庫中的數(shù)據(jù)已處于不一致的狀態(tài),因為此時已經(jīng)沒有‘后勤部’了,但employee 表中仍然保存著屬于后勤部的員工記錄。只有執(zhí)行了第二條DELETE 語句后數(shù)據(jù)才重新處于一致狀態(tài)。但是,如果執(zhí)行完第一條語句后,計算機突然出現(xiàn)故障,無法再繼續(xù)執(zhí)行第二條DELETE 語句,則數(shù)據(jù)庫中的數(shù)據(jù)將處于永遠不一致的狀態(tài)。因此,必須保證這兩條DELETE 語句同時執(zhí)行。為解決類似的問題,數(shù)據(jù)庫系統(tǒng)通常都引入了事務(wù)(Transaction) 的概念。
11.4.2 事務(wù)的概念 事務(wù)是一種機制,是一個操作序列,它包含了一組數(shù)據(jù)庫操作命令,所有的命令作為一個整體一起向系統(tǒng)提交或撤消操作請求,即要么都執(zhí)行,要么都不執(zhí)行。因此,事務(wù)是一個不可分割的工作邏輯單元,類似于操作系統(tǒng)中的原語。在數(shù)據(jù)庫系統(tǒng)上執(zhí)行并發(fā)操作時,事務(wù)是作為最小的控制單元來使用的。
通常在程序中用BEGIN TRANSACTION 命令來標識一個事務(wù)的開始,用COMMITTRANSACTION 命令標識事務(wù)結(jié)束。這兩個命令之間的所有語句被視為一體,只有執(zhí)行到COMMIT TRANSACTION 命令時,事務(wù)中對數(shù)據(jù)庫的更新操作才算確認。和BEGIN…END 命令類似,這兩個命令也可以進行嵌套,即事務(wù)可以嵌套執(zhí)行。這兩個命令的語法如下:
BEGIN TRAN[SACTION] [transaction_name | @tran_name_variable] COMMIT [ TRAN[SACTION] [transaction_name | @tran_name_variable] ] 其中BEGIN TRANSACTION 可以縮寫為BEGIN TRAN、 COMMIT TRANSACTION可以縮寫為COMMIT TRAN 或COMMIT。
- transaction_name
指定事務(wù)的名稱。只有前32 個字符會被系統(tǒng)識別。
- @tran_name_variable
用變量來指定事務(wù)的名稱,變量只能聲明為CHAR、 VARCHAR、 NCHAR 或 NVARCHAR 類型。
 
11.4.3 事務(wù)回滾 事務(wù)回滾(Transaction Rollback) 是指當事務(wù)中的某一語句執(zhí)行失敗時,將對數(shù)據(jù)庫的操作恢復(fù)到事務(wù)執(zhí)行前或某個指定位置。 事務(wù)回滾使用ROLLBACK TRANSACTION 命令,其語法如下: ROLLBACK [TRAN[SACTION] [transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable] ] 其中savepoint_name 和@savepoint_variable 參數(shù)用于指定回滾到某一指定位置。 如果要讓事務(wù)回滾到指定位置,則需要在事務(wù)中設(shè)定保存點(Save Point)。所謂保存點是指定其所在位置之前的事務(wù)語句,不能回滾的語句即此語句前面的操作被視為有效。
其語法如下: SAVE TRAN[SACTION] {savepoint_name | @savepoint_variable} 各參數(shù)說明如下: avepoint_name 指定保存點的名稱。同事務(wù)的名稱一樣,只有前32 個字符會被系統(tǒng)識別。
@savepoint_variable 用變量來指定保存點的名稱。變量只能聲明為CHAR、 VARCHAR、 NCHAR 或NVARCHAR 類型。

 注意:如果不指定回滾的事務(wù)名稱或保存點,則ROLLBACK TRANSACTION命令會將事務(wù)回滾到事務(wù)執(zhí)行前,如果事務(wù)是嵌套的、則會回滾到最靠近的BEGIN TRANSACTION命令前。 |