sqlserver 事务例子
事務(wù)是實(shí)現(xiàn)原子性的手段,原子性是指某些事情要么全部發(fā)生,要么都不發(fā)生,我們都知道,程序的執(zhí)行是有順序的,在程序的執(zhí)行過(guò)程中,難免會(huì)出現(xiàn)錯(cuò)誤,如果對(duì)于某些必須作為原子性事務(wù)發(fā)生的事,在執(zhí)行過(guò)程中,有一部執(zhí)行了,還有另外一部分由于某種錯(cuò)誤而沒(méi)有執(zhí)行,就會(huì)出現(xiàn)大麻煩。大部分的數(shù)據(jù)庫(kù)書都會(huì)舉這個(gè)例子,如果Alina在她的帳號(hào)A上取走了1000元,存在帳號(hào)B上,我們一般都會(huì)這么寫
update checking set A=A-1000 where CountName='Alina'
update saving set B=B+1000 where CountName='Alina'
但如果第一條語(yǔ)句執(zhí)行了,而第二條沒(méi)有執(zhí)行,那么就會(huì)有問(wèn)題了,我們現(xiàn)在希望這兩條語(yǔ)句要么都執(zhí)行,要么都不執(zhí)行,這就要用到事務(wù)了。
下面我就舉一個(gè)小例子幫大家理解一下。
首先我們來(lái)建一個(gè)測(cè)試表
create table MyTranTest
(
?? OrderID int primary key identity
)
現(xiàn)在我們寫一些代碼來(lái)測(cè)試一下
begin tran TranStart
insert into MyTranTest default values
save tran FirstPoint
insert into MyTranTest default values
rollback tran FirstPoint
insert into MyTranTest default values
save tran SecondPoint
insert into MyTranTest default values
rollback tran SecondPoint
insert into MyTranTest default values
commit tran TranStart
然后我們?cè)谑褂?select * from MyTranTest
結(jié)果如下:
也許你就會(huì)納悶了,明明是五條Insert語(yǔ)句,怎么只執(zhí)行了三條。
那我們就一起看一下吧
begin tran TranStart
現(xiàn)在是開始事務(wù)的時(shí)候,這開始了“要么全部,要么全不”的語(yǔ)句組合,然后是Insert一行,在這個(gè)結(jié)合點(diǎn),只有一條語(yǔ)句被插入,下一步創(chuàng)建一個(gè)保存點(diǎn),名為FirstPoint,然后在插入另一行,在這時(shí)已經(jīng)有兩行被插入了,但記住,他們都尚未被提交,因此數(shù)據(jù)庫(kù)并不把他們作為數(shù)據(jù)庫(kù)的一部分。
接下來(lái)是Rollback操作,說(shuō)明白一點(diǎn),并不是回滾到起始點(diǎn),而是回滾到FirstPoint。通過(guò)這次回滾,在進(jìn)行Rollback時(shí)刻和FirstPoint保存點(diǎn)之間的每件事情都被撤銷?,F(xiàn)在你應(yīng)該明白了表中為什么只有三條數(shù)據(jù)了吧,下面的兩個(gè)過(guò)程跟上面的一樣,最后我們調(diào)用Committed tran語(yǔ)句,他鎖住我們的事務(wù),讓他成為數(shù)據(jù)庫(kù)歷史的永久部分。
轉(zhuǎn)載于:https://www.cnblogs.com/wolfcool/archive/2009/06/11/1501004.html
總結(jié)
以上是生活随笔為你收集整理的sqlserver 事务例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对Coverage进行编辑
- 下一篇: vs2005 无法加载服务器控件解决办法