爲何要有事務?html
假設咱們在進行銀行轉賬的時候,至少會執行兩條SQL語句,一條SQL語句是減小轉賬人裏賬戶的錢,一條是增長收賬人裏賬戶錢。 例若有一個朋友要轉賬1000元:一、那麼轉賬人的銀行裏的錢減小1000 sql
二、那麼收賬人的銀行裏的錢增長1000數據庫
咱們往深一點想,在執行這兩條SQL語句的時候,會不會發生問題?會,有時候天災,人禍的。例如。在執行第一條SQL語句的時候,就在這0.001秒之間機器忽然出現故障,那麼這時候有可能第二條SQL語句沒有執行。那這時候轉賬人不就很慘,他本身轉賬了1000元,本身賬戶已經扣了錢,但是對方的賬戶沒收到錢,那麼對方會很生氣的認爲你沒有給他轉賬。.net
這仍是兩條SQL語句出現問題的狀況,試想若是銀行在處理事務時有100條SQL語句要執行,每條都很重要,那麼出現問題的機率不是更大了嗎?爲了針對這種狀況出現了事務。code
那麼什麼是事務?htm
事物是指訪問並可能更新數據庫中各類新據項的一個程序執行單行(UNIT),也就是由多個SQL語句組成,必需做爲一個總體執行。 事物說白了一點,就是同生共死,意思要麼所有的SQL語句都執行成功,要麼所有的SQL語句都執行失敗。因此爲了防止上面那種狀況,要麼兩條SQL語句都執行成功,要麼兩條SQL語句都執行失敗。blog
經過例子來了解一下事務,在舉個例子前先看一下,先看幾個事務經常使用到的詞事務
當沒有發生錯誤的時候即可以將事務進行提交(CIMMIT TRANSACTION),而查看有沒有SQL語句的執行錯誤,能夠用 @@ERROR來進行查看。當發生錯誤的時候便使用(ROLL BACK TRANSACTION)將SQL語句回滾到最最以前,沒有執行SQL語句那時候。get
先來經過表後插入兩條SQL語句再更新,看一下失敗的狀況博客
代碼以下:
View Code
--消息 547,級別 16,狀態 0,第 1 行
--UPDATE 語句與 CHECK 約束"CK__bank__balance__0519C6AF"衝突。該衝突發生於數據庫"test",表"dbo.bank", column 'balance'。
--語句已終止。
--(1 行受影響)
select * from bank
bid balance
001 1000.00
002 1100.00
查看結果發現 002的值增長了1000,可是001的值並無變爲0。
如何用SQL語句建立事務,避免上面那種狀況
DECLARE @sumError int set @sumError=0 BEGIN TRANSACTION update bank set balance=balance-1000 where bid='001'; set @sumError = @sumError +@@Error update bank set balance=balance+1000 where bid='002'; set @sumError = @sumError +@@Error IF(@sumError = 0) BEGIN COMMIT TRANSACTION END ELSE BEGIN ROLLBACK TRANSACTION END
--經過上面的事務代碼,兩條代碼要麼同時執行成功,要麼同時執行失敗
轉自博客園:http://www.cnblogs.com/cxeye/archive/2012/08/17/2643482.html