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