事務的概念:簡單說就訪問並可能更新數據庫中各類數據項的一個程序執行單元,一旦開啓事務,全部對數據的操做要麼所有執行,要麼所有都不執行。單條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