SQLServer之創建顯式事務

来源:https://www.cnblogs.com/vuenote/archive/2018/11/07/9923626.html
-Advertisement-
Play Games

顯式事務定義 顯式事務以 BEGIN TRANSACTION 語句開始,並以 COMMIT 或 ROLLBACK 語句結束。 備註 BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 遞增。 BEGIN TRANSACTION 代表一點,由連接引用的數據在該點邏輯和物理上都一致的 ...


顯式事務定義

顯式事務以 BEGIN TRANSACTION 語句開始,並以 COMMIT 或 ROLLBACK 語句結束。

備註

BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 遞增。

BEGIN TRANSACTION 代表一點,由連接引用的數據在該點邏輯和物理上都一致的。 如果遇上錯誤,在 BEGIN TRANSACTION 之後的所有數據改動都能進行回滾,以將數據返回到已知的一致狀態。 每個事務繼續執行直到它無誤地完成並且用 COMMIT TRANSACTION 對資料庫作永久的改動,或者遇上錯誤並且用 ROLLBACK TRANSACTION 語句擦除所有改動。

BEGIN TRANSACTION 為發出本語句的連接啟動一個本地事務。 根據當前事務隔離級別的設置,為支持該連接所發出的 Transact-SQL 語句而獲取的許多資源被該事務鎖定,直到使用 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 語句完成該事務為止。 長時間處於未完成狀態的事務會阻止其他用戶訪問這些鎖定的資源,也會阻止日誌截斷。

雖然 BEGIN TRANSACTION 啟動一個本地事務,但是在應用程式接下來執行一個必須記錄的操作(如執行 INSERT、UPDATE 或 DELETE 語句)之前,它並不被記錄在事務日誌中。 應用程式能執行一些操作,例如為了保護 SELECT 語句的事務隔離級別而獲取鎖,但是直到應用程式執行一個修改操作後日誌中才有記錄。

在一系列嵌套的事務中用一個事務名給多個事務命名對該事務沒有什麼影響。 系統僅登記第一個(最外部的)事務名。 回滾到其他任何名稱(有效的保存點名除外)都會產生錯誤。 事實上,回滾之前執行的任何語句都不會在錯誤發生時回滾。 這些語句僅當外層的事務回滾時才會進行回滾。

如果在語句提交或回滾之前執行瞭如下操作,由 BEGIN TRANSACTION 語句啟動的本地事務將升級為分散式事務:

  • 執行一個引用鏈接伺服器上的遠程表的 INSERT、DELETE 或 UPDATE 語句。 如果用於訪問鏈接伺服器的 OLE DB 訪問介面不支持 ITransactionJoin 介面,則 INSERT、UPDATE 或 DELETE 語句會失敗。

  • 當啟用了 REMOTE_PROC_TRANSACTIONS 選項時,將調用遠程存儲過程。

    SQL Server 的本地副本成為事務控制器並且使用 Microsoft 分散式事務處理協調器 (MS DTC) 來管理分散式事務。

    使用 BEGIN DISTRIBUTED TRANSACTION 可以將事務作為分散式事務顯式執行。 有關詳細信息,請參閱 BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)。

    SET IMPLICIT_TRANSACTIONS 設置為 ON 時,BEGIN TRANSACTION 語句創建兩個嵌套的事務。 有關詳細信息,請參閱 SET IMPLICIT_TRANSACTIONS (Transact-SQL)

記的事務

WITH MARK 選項使事務名被置於事務日誌中。 將資料庫還原到早期狀態時,可使用標記事務代替日期和時間。 有關詳細信息,請參閱 使用標記的事務一致地恢復相關的資料庫的事務(完全恢復模式)和 RESTORE (Transact-SQL)。

另外,若要將一組相關資料庫恢復到邏輯上一致的狀態,必須使用事務日誌標記。 標記可由分散式事務置於相關資料庫的事務日誌中。 將這組相關資料庫恢復到這些標記將產生一組在事務上一致的資料庫。 在相關資料庫中放置標記需要特殊的過程。

只有當資料庫由標記事務更新時,才在事務日誌中放置標記。 不修改數據的事務不被標記。

使用T-SQL腳本創建顯式事務

語法:

--聲明資料庫引用
use 資料庫名稱;
go

begin { tran| transaction } [ { transaction_name | @tran_name_variable } [ with mark [ 'description' ] ]
begin
業務代碼1;

save  { tran | transaction } { savepoint_name | @savepoint_variable };

rollback { tran | transaction } [ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ];

commit { tran | transaction }  { transaction_name | @tran_name_variable } with(delayed_durability=on);

end
go

語法解析:

--begin transaction transaction_name
--適用範圍:SQL Server(從 2008 版開始)和 Azure SQL Database
--分配給事務的名稱。 transaction_name 必須符合標識符規則,但標識符所包含的字元數不能大於 32。 僅在最外面的 BEGIN...COMMIT 或 BEGIN...ROLLBACK 嵌套語句對中使用事務名。
--transaction_name 始終區分大小寫,即使 SQL Server 實例不區分大小寫也是如此。

--begin transaction @tran_name_variable 
--適用範圍:SQL Server(從 2008 版開始)和 Azure SQL Database
--用戶定義的、含有有效事務名稱的變數的名稱。 必須使用 char、varchar、nchar 或 nvarchar 數據類型聲明該變數。 如果傳遞給該變數的字元多於 32 個,則僅使用前面的 32 個字元;其餘的字元將被截斷。

--with mark [ 'description' ]
--適用範圍:SQL Server(從 2008 版開始)和 Azure SQL Database
--指定在日誌中標記事務。 description 是描述該標記的字元串。 在將長於 128 個字元的 description 存儲到 msdb.dbo.logmarkhistory 表中之前,先將其截斷為 128 個字元。
--如果使用了 WITH MARK,則必須指定事務名。 WITH MARK 允許將事務日誌還原到命名標記。

--save transaction savepoint_name
--分配給保存點的名稱。 保存點名稱必須符合標識符的規則,但長度不能超過 32 個字元。 savepoint_name 始終區分大小寫,即使 SQL Server 實例不區分大小寫也是如此。

--save transaction @savepoint_variable 
--包含有效保存點名稱的用戶定義變數的名稱。 必須使用 char、varchar、nchar 或 nvarchar 數據類型聲明該變數。 如果長度超過 32 個字元,也可以傳遞到變數,但只使用前 32 個字元。

--rollback { tran | transaction } [ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ];
--將顯式事務或隱性事務回滾到事務的起點或事務內的某個保存點。 可以使用 ROLLBACK TRANSACTION 清除自事務的起點或到某個保存點所做的所有數據修改。 它還釋放由事務控制的資源。

--commit { tran | transaction } { transaction_name | @tran_name_variable };
--標誌一個成功的隱性事務或顯式事務的結束。 如果 @@TRANCOUNT 為 1,COMMIT TRANSACTION 使得自從事務開始以來所執行的所有數據修改成為資料庫的永久部分,釋放事務所占用的資源,並將 @@TRANCOUNT 減少到 0。
--如果 @@TRANCOUNT 大於 1,則 COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 遞減並且事務將保持活動狀態。

--delayed_durability
--適用範圍:SQL Server 和 Azure SQL 資料庫
--請求將此事務與延遲持續性一起提交的選項。 如果已用 DELAYED_DURABILITY = DISABLED 或 DELAYED_DURABILITY = FORCED 更改了資料庫,則忽略該請求。 有關詳細信息,請參閱主題控制事務持續性。

示例:

--聲明資料庫引用
use testss;
go

begin transaction explicittran
with mark '開啟一個顯式事務'
begin
declare @counts int =0;

insert into test1(name,sex,age,classid,height) values('事務測試','男','21','20','178');
set @counts=@counts+(select @@ROWCOUNT);
save tran inserttran1;--回滾點一,事務已經插入了一條數據

insert into test2(name) values('事務測試');
set @counts=@counts+(select @@ROWCOUNT);
save tran inserttran2;--回滾點二,事務已經插入了二條數據

insert into test3(name,sex,age,classid) values('事務班','男','asd','23');
set @counts=@counts+(select @@ROWCOUNT);
save tran inserttran3;--回滾點三,事務已經插入了三條數據

--出錯回滾到回滾點
if @counts=3
rollback transaction inserttran3;
else if @counts=2
rollback transaction inserttran2;
else if @counts=1
rollback transaction inserttran1;

--提交事務或者回滾事務
if @counts<>0
commit transaction explicittran
--with(delayed_durability=on)
;
else
rollback transaction explicittran;
end
go

示例結果:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引用鏈接: https://blog.csdn.net/linuxheik/article/details/77853119 https://www.cnblogs.com/doscho/p/6221867.html ...
  • 一、持久化統計信息的意義: 統計信息用於指導mysql生成執行計劃,執行計劃的準確與否直接影響到SQL的執行效率;如果mysql一重啟 之前的統計信息就沒有了,那麼當SQL語句來臨時,那麼mysql就要收集統計信息然後再生成SQL語句的執行 計劃。如果能在關閉mysql的時候就把統計信息保存起來,那 ...
  • 一 需求描述 我們知道數據是公司的重要資產,業務的系統化、信息化就是數字化。數據高效的存儲與查詢是系統完善和優化的方向,而資料庫的穩定性、可靠性是實現的基礎。高可用和RPO(RecoveryPointObjective,複原點目標,指能容忍的最大數據丟失量)是衡量一個資料庫優劣的重要指標。作為一個D ...
  • redis持久化 1.redis持久化介紹 我們知道redis性能之所以強悍,是因為redis在運行時將數據都存放在了訪問效率遠高於硬碟的記憶體之中。可是這帶來了新的問題:在redis或者外部系統重啟時,記憶體中的數據將會丟失,由於目前的記憶體介質RAM是易失的,非正常的斷電也會導致數據的丟失。 在一些場 ...
  • @[toc] 方法一:修改配置文件 1. 在my.ini的[mysqld]欄位加入: skip grant tables ; 2. 重啟mysql服務,這時的mysql不需要密碼即可登錄資料庫; 3. 然後進入mysql(在命令行中修改密碼):     mys ...
  • 前段時間看了《高性能MySQL》中的選擇優化的數據類型,這裡主要是做一下筆記。 首先數據選擇有幾個簡單原則: 更小的通常更好。一般情況下,應該儘量使用可以正確存儲數據的最小數據類型。例如只需要存 0~200,tinyint unsigned 更好。更小的數據類型通常更快,因為它們占用更少的磁碟、記憶體 ...
  • @[toc] 一、MYSQL的安裝 1、打開下載的mysql安裝文件mysql 5.0.27 win32.zip,雙擊解壓縮,運行“setup.exe”。 2、選擇安裝類型,有“Typical(預設)”、“Complete(完全)”、“Custom(用戶自定義)”三個選項,選擇“Custom”,按“ ...
  • 一.概述 接著上篇繼續,這篇把數據結構之字典學習完, 這篇知識點包括:哈希演算法,解決鍵衝突, rehash , 漸進式rehash,字典API。 1.1 哈希演算法 當一個新的鍵值對 需要添加到字典裡面時,程式需要先根據“鍵值對”的鍵計算出哈希值和索引值,再根據索引值,將包含新“鍵值對”的哈希表節點放 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...