sqlserver-事務處理

事務的概念:簡單說就訪問並可能更新數據庫中各類數據項的一個程序執行單元,一旦開啓事務,全部對數據的操做要麼所有執行,要麼所有都不執行。單條sql語句自己就是一個事務.sql

事務的屬性數據庫

  事務是做爲單個邏輯工做單元執行的一系列操做。一個邏輯工做單元必須有4個屬性,稱爲原子性(Atomic)、 一致性(Consistent)、隔離性(Isolated)、持久性(Durable),簡稱ACID屬性,只有這樣才能構成一個事務。spa

  原子性:整個事務中的全部操做,要麼所有完成,要麼所有不完成,不可能停滯在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。.net

  一致性:在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。code

  隔離性:兩個事務的執行是互不干擾的,一個事務不可能看到其餘事務運行時,中間某一時刻的數據。blog

  持久性:在事務完成之後,該事務所對數據庫所做的更改便持久的保存在數據庫之中,並不會被回滾。事務

工做開發過程當中對事務的依賴性很強,複雜一點的sql操做通常都離不開事務.開發

舉個很簡單的例子,銀行轉帳是簡單能夠分爲兩個步驟字符串

如:帳號A向帳號B轉1000元錢。get

一、帳號B+1000元;

二、帳號A-1000元;

這兩步是不可分的,假如帳號B+1000元后,執行第二步發現帳號A餘額不足時(固然實際開發中會先判斷餘額,這裏是假設),執行失敗,那麼帳號B就多出了1000元,而帳號A卻沒減去1000元。

有了事務咱們就能夠保證這兩步要麼所有執行,要麼所有不執行。

僞代碼:

begin 事務

  update 帳號表 set money=money+1000 where 帳號=帳號B;

  update 帳號表 set money=money-1000 where 帳號=帳號A;

if 程序報錯

  rollback 事務;

else

  commit 事務;

--------------------------------------------------------------------------------------------------------------------------------

sql代碼

1 create table tbl_test( 2     id nvarchar(10), 3     name nvarchar(5) 4 ); 5 insert into tbl_test values('001','名字1'); 6 update tbl_test set name='名字2' where id='001'
7 update tbl_test set name='名字超過5字' where id='001' --這句話會報錯 將截斷字符串或二進制數據。

 

上面的代碼最後執行完,會將名字1改成名字2

加上事務

 1 begin transaction
 2 update tbl_test set name='名字2' where id='001';  3 update tbl_test set name='名字超過5字' where id='001';  4 if @@error <> 0
 5     begin
 6         rollback transaction
 7     end
 8 else
 9     begin
10         commit transaction 
11     end

執行結果name字段的值仍是名字1,第二句update執行失敗了以後,第一句update也沒有執行。

另外一種寫法:T-sql是有異常機制的

 1 begin try  2     begin transaction
 3         update tbl_test set name='名字2' where id='001';  4         update tbl_test set name='名字超過5字' where id='001';  5         commit transaction 
 6 end try  7 begin catch  8     --select ERROR_NUMBER() as 錯誤代碼 
 9     rollback transaction 
10 end catch
相關文章
相關標籤/搜索