国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
sql server transaction
<!--[endif]-->

仔細(xì)研究了下,發(fā)現(xiàn)sql server里面的explicit transaction還是有點(diǎn)復(fù)雜的。以下是有些總結(jié):

·         Commit transaction 會提交所有嵌套的transaction修改。但是如果嵌套的transaction里面有rollback tran to save point, 那么save point之后的部分會revert掉。

delete from dbo.numbertable

begin tran out1

     insert into dbo.numbertable values(1)

     insert into dbo.numbertable values(2)

    

     begin tran inn1

          insert into dbo.numbertable values(3)

          insert into dbo.numbertable values(4)

     save tran inn1SavePoint

          insert into dbo.numbertable values(5)

     rollback tran inn1SavePoint

     commit tran inn1

commit tran out1

 

·         @@TRANCOUNT可以用來記錄當(dāng)前session transaction的個數(shù),對于嵌套的transaction來講,每次begin transaction都讓它加一,每次commit tran都會讓它減一。所以在語句里面可以通過select @@TRANCOUNT 來檢查當(dāng)前是否在一個transaction里面。如果當(dāng)前@@TRANCOUNT0,那調(diào)用commit還是rollback都會出現(xiàn)語句錯誤。在嵌套的transaction里面,rollback是很特殊的,它會直接把@@TRANCOUNT設(shè)置為0

begin tran

begin tran

begin tran

print @@trancount

rollback tran

print @@trancount

 

·         對于嵌套的transaction來講,rollback的寫法是很特殊。如果嵌套,rollback transaction后面是不能帶transactionname的,要帶也只能是最外面的transactionname。Rollback只會拋棄所有嵌套transactionrollback語句之前的修改。Rollback之后的更新依然提交就去了,原因在于:rollback之后,@@trancount0,那么rollback之后的語句就不屬于explicit transaction, 屬于autocmmit transaction了,自動提交。

delete from dbo.numbertable

begin tran t1

     insert into dbo.numbertable values(1)

    

     begin tran t2

          insert into dbo.numbertable values(2)

     rollback tran

     print 'after rollback in innert transaction, the transaction count is: '+cast(@@trancount, varchar(5))

     insert into dbo.numbertable values(3)

--commit tran

select * from dbo.numbertable

 

·         存儲過程里面也可以begin transaction,如果調(diào)用的地方也begin transaction,那么這種情況也屬于嵌套transaction,如果在存儲過程里面rollback,得到的結(jié)果和上面一樣。但是有一點(diǎn)特殊的地方在與,執(zhí)行存儲過程結(jié)束的時候會比較開始執(zhí)行sp@@trancount和結(jié)束時候@@trancount的值,如果不一樣,它會給出一個消息像“Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.”這個給出的消息并不會影響其后的執(zhí)行。

CREATE PROCEDURE [dbo].[AddNumber]      

AS

BEGIN

     begin tran

          insert into dbo.numbertable values(1)

          insert into dbo.numbertable values(2)

          insert into dbo.numbertable values(3)

     rollback tran

END

delete from dbo.numbertable

begin tran out1

exec dbo.addnumber

print @@trancount

insert into dbo.numbertable values(3)

select * from dbo.numbertable

 

·         如果在sp里面rollback了,那到外滿做commit 或者rollback都是沒有效果并且出錯了,因?yàn)榍短椎?/span>transaction內(nèi)部transaction一旦調(diào)用了rollback,@@trancount就為0了,在外滿commitrollback直接出錯。比如如下sp,我想像在最外面rollback,那就出錯了,因?yàn)?/span>sp里面語句rollback了。表里面始終會插入值3。

delete from dbo.numbertable

begin tran out1

exec dbo.addnumber

print @@trancount

insert into dbo.numbertable values(3)

rollback tran out1

select * from dbo.numbertable

 

·         所有對于嵌套的transaction來講,如果內(nèi)部transaction一旦rollback,就會給外部的transaction留下一個大坑。為了解決這個為題,有兩種解決方案:

1.       在外部的transaction里面檢查@@trancount,如果這個值跟你代碼begin tran的可以一致,那說明內(nèi)部transaction沒有rollback,那可以繼續(xù)commit或者rollback。

delete from dbo.numbertable

begin tran t1

     insert into dbo.numbertable values(1)

    

     begin transaction t2

          insert into dbo.numbertable values(2)

     rollback tran

 

     if @@trancount = 1

     begin

          insert into dbo.numbertable values(3)

          commit tran

     end

2.       在所有的內(nèi)部transaction里面,只能commit,不能rollback。如果必須rollback,那怎么辦?save point就可以派上用場了。比如sp改成這樣子:

ALTER PROCEDURE [dbo].[AddNumber]       

AS

BEGIN

     begin tran

     save tran pp

          insert into dbo.numbertable values(1)

          insert into dbo.numbertable values(2)

          insert into dbo.numbertable values(3)

     rollback tran pp

     commit tran

END

 

begin tran out1

exec dbo.addnumber

print @@trancount

insert into dbo.numbertable values(3)

commit tran out1

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
批量插入
事務(wù)全攻略
sql server 事務(wù)處理
別使用嵌套事務(wù)
SQLServer陷阱
SQL Server數(shù)據(jù)庫事務(wù)處理詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服