sqlserver-事务处理
事務(wù)的概念:簡單說就訪問并可能更新數(shù)據(jù)庫中各種數(shù)據(jù)項的一個程序執(zhí)行單元,一旦開啟事務(wù),所有對數(shù)據(jù)的操作要么全部執(zhí)行,要么全部都不執(zhí)行。單條sql語句本身就是一個事務(wù).
事務(wù)的屬性:
事務(wù)是作為單個邏輯工作單元執(zhí)行的一系列操作。一個邏輯工作單元必須有4個屬性,稱為原子性(Atomic)、 一致性(Consistent)、隔離性(Isolated)、持久性(Durable),簡稱ACID屬性,只有這樣才能構(gòu)成一個事務(wù)。
原子性:整個事務(wù)中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣。
一致性:在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性約束沒有被破壞。
隔離性:兩個事務(wù)的執(zhí)行是互不干擾的,一個事務(wù)不可能看到其他事務(wù)運行時,中間某一時刻的數(shù)據(jù)。
持久性:在事務(wù)完成以后,該事務(wù)所對數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中,并不會被回滾。
工作開發(fā)過程中對事務(wù)的依賴性很強(qiáng),復(fù)雜一點的sql操作一般都離不開事務(wù).
舉個很簡單的例子,銀行轉(zhuǎn)賬是簡單可以分為兩個步驟
如:賬號A向賬號B轉(zhuǎn)1000元錢。
1、賬號B+1000元;
2、賬號A-1000元;
這兩步是不可分的,假如賬號B+1000元后,執(zhí)行第二步發(fā)現(xiàn)賬號A余額不足時(當(dāng)然實際開發(fā)中會先判斷余額,這里是假設(shè)),執(zhí)行失敗,那么賬號B就多出了1000元,而賬號A卻沒減去1000元。
有了事務(wù)我們就可以保證這兩步要么全部執(zhí)行,要么全部不執(zhí)行。
偽代碼:
begin 事務(wù)
update 賬號表 set?money=money+1000 where 賬號=賬號B;
update 賬號表 set?money=money-1000 where 賬號=賬號A;
if 程序報錯
rollback 事務(wù);
else
commit 事務(wù);
--------------------------------------------------------------------------------------------------------------------------------
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' --這句話會報錯 將截斷字符串或二進(jìn)制數(shù)據(jù)。?
上面的代碼最后執(zhí)行完,會將名字1改為名字2
加上事務(wù)
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執(zhí)行結(jié)果name字段的值還是名字1,第二句update執(zhí)行失敗了之后,第一句update也沒有執(zhí)行。
另一種寫法:T-sql是有異常機(jī)制的
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?
轉(zhuǎn)載于:https://www.cnblogs.com/fnz0/p/5444929.html
總結(jié)
以上是生活随笔為你收集整理的sqlserver-事务处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016浙江省赛过山车记
- 下一篇: Mybatis接口注解开发