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