日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sqlserver-事务处理

發(fā)布時間:2024/4/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sqlserver-事务处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

事務(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ù)運(yùn)行時,中間某一時刻的數(shù)據(jù)。

  持久性:在事務(wù)完成以后,該事務(wù)所對數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中,并不會被回滾。

工作開發(fā)過程中對事務(wù)的依賴性很強(qiáng),復(fù)雜一點(diǎn)的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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。