事務(wù)

SQL Server中的事務(wù)簡(jiǎn)述

事務(wù)是單個(gè)工作單元。 如果某一事務(wù)成功,則在該事務(wù)中進(jìn)行的所有數(shù)據(jù)修改均會(huì)提交,成為數(shù)據(jù)庫(kù)中的永久組成部分。 如果事務(wù)遇到錯(cuò)誤且必須取消或回滾,則所有數(shù)據(jù)修改均被清除。
??SQL Server 以下列事務(wù)模式運(yùn)行。

  • 自動(dòng)提交事務(wù):每條單獨(dú)的語(yǔ)句都是一個(gè)事務(wù)。
  • 顯式事務(wù):每個(gè)事務(wù)均以 BEGIN TRANSACTION 語(yǔ)句顯式開始,以 COMMIT 或 ROLLBACK 語(yǔ)句顯式結(jié)束。
  • 隱式事務(wù):在前一個(gè)事務(wù)完成時(shí)新事務(wù)隱式啟動(dòng),但每個(gè)事務(wù)仍以 COMMIT 或 ROLLBACK 語(yǔ)句顯式完成。
  • 批處理級(jí)事務(wù):只能應(yīng)用于多個(gè)活動(dòng)結(jié)果集 (MARS),在 MARS 會(huì)話中啟動(dòng)的 Transact-SQL 顯式或隱式事務(wù)變?yōu)榕幚砑?jí)事務(wù)。 當(dāng)批處理完成時(shí)沒(méi)有提交或回滾的批處理級(jí)事務(wù)自動(dòng)由 SQL Server 進(jìn)行回滾。

事務(wù)語(yǔ)句

一個(gè)顯式事務(wù)可以由三個(gè)語(yǔ)句來(lái)描述,它們分別是開始事務(wù)、提交事務(wù)和回滾事務(wù)。

①開始事務(wù)

BEGIN { TRAN | TRANSACTION }   
    [{ transaction_name | @tran_name_variable }]  
  • transaction_name :分配給事務(wù)的名稱。
  • @tran_name_variable:事務(wù)變量名。

②提交事務(wù)語(yǔ)句

COMMIT [{TRAN|TRANSACTION} [transaction_name|@tran_name_variable]] [WITH(DELAYED_DURABILITY = { OFF | ON })]  
  • DELAYED_DURABILITY:請(qǐng)求將此事務(wù)與延遲持續(xù)性一起提交的選項(xiàng)。 如果已用 DELAYED_DURABILITY = DISABLED 或 DELAYED_DURABILITY = FORCED 更改了數(shù)據(jù)庫(kù),則忽略該請(qǐng)求。

事務(wù)可以嵌套。當(dāng)在嵌套事務(wù)中使用時(shí),內(nèi)部事務(wù)的提交并不釋放資源或使其修改成永久修改。只有提交了外部事務(wù)時(shí),數(shù)據(jù)修改才具有永久性,而且資源才會(huì)被釋放。
??標(biāo)志一個(gè)成功的隱性事務(wù)或顯式事務(wù)的結(jié)束。 如果 @@TRANCOUNT為 1,所有的數(shù)據(jù)修改執(zhí)行,因?yàn)槭聞?wù)的數(shù)據(jù)庫(kù)的永久部分開始釋放由事務(wù)和 @ 遞減持有的資源的 COMMIT TRANSACTION ,從而使@TRANCOUNT為 0。 如果 @@TRANCOUNT大于 1,COMMIT TRANSACTION 遞減 @@TRANCOUNT只能由 1 和事務(wù)將保持活動(dòng)狀態(tài)。

③事務(wù)回滾語(yǔ)句

ROLLBACK { TRAN | TRANSACTION }   
     [ transaction_name | @tran_name_variable  
     | savepoint_name | @savepoint_variable ]   
  • savepoint_name:是savepoint_name從 SAVE TRANSACTION 語(yǔ)句。
  • @savepoint_variable:是用戶定義的、包含有效保存點(diǎn)名稱的變量的名稱。

【備注】
??無(wú)savepoint_name或transaction_name的時(shí)候?qū)⒒貪L到事務(wù)開始。嵌套事務(wù)時(shí),該語(yǔ)句將所有內(nèi)層事務(wù)回滾到最外面的 BEGIN TRANSACTION 語(yǔ)句。
??在執(zhí)行 COMMIT TRANSACTION 語(yǔ)句后不能回滾事務(wù),但是 COMMIT TRANSACTION如果包含在要回滾的事務(wù)中的嵌套事務(wù)關(guān)聯(lián)時(shí)除外。 在這種情況下,也將回滾嵌套事務(wù),即使您對(duì)它發(fā)出了 COMMIT TRANSACTION。
??在事務(wù)內(nèi)允許有重復(fù)的保存點(diǎn)名稱,但如果 ROLLBACK TRANSACTION 使用重復(fù)的保存點(diǎn)名稱,則只回滾到最近的使用該保存點(diǎn)名稱的 SAVE TRANSACTION。
??在事務(wù)處理中,并不是所有T-SQL語(yǔ)句都可以通過(guò)回滾取消執(zhí)行的。例如創(chuàng)建/修改和刪除數(shù)據(jù)庫(kù)等對(duì)數(shù)據(jù)庫(kù)進(jìn)行的操作,對(duì)數(shù)據(jù)庫(kù)造成的影響是不能恢復(fù)的。因此,這些操作不能用于事務(wù)處理。

④設(shè)置事務(wù)保存點(diǎn)

SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }

用戶可以在事務(wù)內(nèi)設(shè)置保存點(diǎn)或標(biāo)記。 保存點(diǎn)可以定義在按條件取消某個(gè)事務(wù)的一部分后,該事務(wù)可以返回的一個(gè)位置。 如果將事務(wù)回滾到保存點(diǎn),則根據(jù)需要必須完成其他剩余的 Transact-SQL 語(yǔ)句和 COMMIT TRANSACTION 語(yǔ)句,或者必須通過(guò)將事務(wù)回滾到起始點(diǎn)完全取消事務(wù)。 若要取消整個(gè)事務(wù),使用窗體 ROLLBACK TRANSACTION transaction_name。 這將撤消事務(wù)的所有語(yǔ)句和過(guò)程。
??在事務(wù)中允許有重復(fù)的保存點(diǎn)名稱,但指定保存點(diǎn)名稱的 ROLLBACK TRANSACTION 語(yǔ)句只將事務(wù)回滾到使用該名稱的最近的 SAVE TRANSACTION。
??在使用 BEGIN DISTRIBUTED TRANSACTION 顯式啟動(dòng)或從本地事務(wù)升級(jí)的分布式事務(wù)中,不支持 SAVE TRANSACTION。

示例

A、提交嵌套事務(wù)
下面的示例創(chuàng)建一個(gè)表,生成三個(gè)級(jí)別的嵌套事務(wù),然后提交嵌套的事務(wù)。

CREATE TABLE TestTran (Cola int PRIMARY KEY, Colb char(3));  
GO  
-- This statement sets @@TRANCOUNT to 1.  
BEGIN TRANSACTION OuterTran;  

PRINT N'Transaction count after BEGIN OuterTran = '  
+ CAST(@@TRANCOUNT AS nvarchar(10));  
INSERT INTO TestTran VALUES (1, 'aaa');  

  -- This statement sets @@TRANCOUNT to 2.  
  BEGIN TRANSACTION Inner1;  
  PRINT N'Transaction count after BEGIN Inner1 = '  
     + CAST(@@TRANCOUNT AS nvarchar(10));   
  INSERT INTO TestTran VALUES (2, 'bbb');  

     -- This statement sets @@TRANCOUNT to 3.  
     BEGIN TRANSACTION Inner2;  
     PRINT N'Transaction count after BEGIN Inner2 = '  
       + CAST(@@TRANCOUNT AS nvarchar(10));    
     INSERT INTO TestTran VALUES (3, 'ccc');    
      -- This statement decrements @@TRANCOUNT to 2.  
      -- Nothing is committed.  
     COMMIT TRANSACTION Inner2;  

  PRINT N'Transaction count after COMMIT Inner2 = '  
    + CAST(@@TRANCOUNT AS nvarchar(10));  
 
  -- This statement decrements @@TRANCOUNT to 1.  
  -- Nothing is committed.  
  COMMIT TRANSACTION Inner1;  

PRINT N'Transaction count after COMMIT Inner1 = '  
    + CAST(@@TRANCOUNT AS nvarchar(10));  
  
-- This statement decrements @@TRANCOUNT to 0 and  
-- commits outer transaction OuterTran.  
COMMIT TRANSACTION OuterTran;  
  
PRINT N'Transaction count after COMMIT OuterTran = '  
    + CAST(@@TRANCOUNT AS nvarchar(10));  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,957評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,248評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,081評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,485評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,720評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,263評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,025評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,204評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,461評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,945評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,205評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容

  • 本文包括:1、事務(wù)概念2、MySQL管理事務(wù)3、JDBC控制事務(wù)進(jìn)程4、事務(wù)的特性(ACID)5、事務(wù)的隔離級(jí)別6...
    廖少少閱讀 846評(píng)論 0 3
  • 本篇文章主要介紹的是 MySQL / JDBC 中的事務(wù),為了方便讀者瀏覽,這里默認(rèn)需要讀者已經(jīng)掌握 SQL基礎(chǔ) ...
    SawyerZh閱讀 1,617評(píng)論 7 31
  • 很多人喜歡這篇文章,特此同步過(guò)來(lái) 由淺入深談?wù)搒pring事務(wù) 前言 這篇其實(shí)也要?dú)w納到《常識(shí)》系列中,但這重點(diǎn)又...
    碼農(nóng)戲碼閱讀 4,758評(píng)論 2 59
  • 從事務(wù)理論的角度來(lái)說(shuō),可以把事務(wù)分為以下幾種類型:?扁平事務(wù)(Flat Transactions)?帶有保存點(diǎn)的扁...
    邱杉的博客閱讀 1,192評(píng)論 0 51
  • 1、概述 ??事務(wù)是數(shù)據(jù)庫(kù)區(qū)別于文件系統(tǒng)的重要特征之一,其用于保證數(shù)據(jù)庫(kù)的完整性,事務(wù)能使批量的SQL語(yǔ)句要么完全...
    黒貓閱讀 755評(píng)論 0 2