SQL Server事務遭遇網路異常時的處理機制淺析

来源:http://www.cnblogs.com/kerrycode/archive/2017/07/27/7245891.html
-Advertisement-
Play Games

SQL Server資料庫中,如果應用程式正在執行一個事務的時候突然遭遇了網路異常,例如網路掉包,網路中斷等,那麼這個事務會怎麼樣? SQL Server資料庫是通過什麼機制來判斷處理呢? 估計很多人跟我一樣都有不少疑問, 我們下麵構造一個測試實驗來測試驗證一下。如下所示: 步驟1:在客戶端連使用S ...


SQL Server資料庫中,如果應用程式正在執行一個事務的時候突然遭遇了網路異常,例如網路掉包,網路中斷等,那麼這個事務會怎麼樣? SQL Server資料庫是通過什麼機制來判斷處理呢? 估計很多人跟我一樣都有不少疑問, 我們下麵構造一個測試實驗來測試驗證一下。如下所示:

 

 

步驟1:在客戶端連使用SSMS工具連接到測試資料庫,執行下麵腳本,顯性事務既不提交也不回滾。模擬事務正在執行當中。

 

USE AdventureWorks2012;

GO

SELECT@@SPID;

 

 

BEGINTRAN

 

    DELETEFROM [dbo].[Products] WHERE ProductID=1;

 

    --ROLLBACK;

 

 

輸出的會話ID59

 

 

 

步驟2:在測試伺服器上開啟Profiler跟蹤一下具體信息。具體步驟略過。

 

 

 

步驟3:通過VMware vSphere Client的控制台連接到測試伺服器,禁用網卡,然後啟用網卡,模擬網路異常。(註意:玩過Vmware的應該都知道,這裡不詳細介紹!)

 

 

如下截圖所示,在跟蹤過程中,我們可以看到當我構造網路異常時,會話ID=59的事務立即回滾了。

 

 

clip_image001[4]

 

 

當然你也可以使用下麵函數查看日誌裡面的相關記錄信息。如下所示:

 

 

SELECT*

FROMfn_dblog(NULL,NULL)

WHERE Operation ='LOP_ABORT_XACT';

 

clip_image002[4]

 

你可以看到 LOP_BEGIN_XACT (事務開始)->   LOP_DELETE_ROWS (刪除記錄) ->  LOP_INSERT_ROWS (插入記錄)  ->LOP_ABORT_XACT (事務回滾)

 

clip_image003[4]

 

 

通過上面實驗測試,我們知道當應用程式遭遇網路異常時,資料庫會回滾未提交的事務。那麼接下來的問題有下麵幾個:

 

 

 

1 SQL Server需要多長時間才能檢測到會話的網路異常?

 

如上所示,我斷開的是伺服器的網路,會話立即就回滾了。但是如果我斷開的是客戶端(執行SSMS客戶端的網路),那麼會話回滾的時間是30。如下截圖所示

 

事務開始時間為: 2017-07-27 13:48:01:820

事務回滾時間為: 2017-07-27 13:48:32.043

 

clip_image004[4]

 

clip_image005[4]

 

 

這個是伺服器上Keep Alive參數控制的,具體位置 SQL Server Configuration Manager->  SQL Server Network Configuration ->  "Protocol for MSSQLSERVER" ->  "TCP/IP " 右鍵單擊屬性,如下截圖所示:

 

 

30000 的單位是毫秒, 等價於30秒, 如果你將這個設置為60000 ,那麼測試結果就會是60秒或超過60秒。

 

clip_image006[4]

 

 

當然這個時間差是你斷開網路的時間和事務結束的時間差,而不是事務開始時間與結束時間差,如下測試所示,截圖1,由於需找到禁用網路的位置,然後又切換視窗,導致延誤了幾秒,這個事務開始、結束時間差為70秒。 當然這個值不可能完全等於Keep Alive的值,因為還涉及參數Keep Alive Interval的值,所以這個值玩玩是大於等於Keep Alive的值。具體後面會講述!

 

clip_image007[4]

 

clip_image008[4]

 

clip_image009[4]

 

 

2 SQL Server通過什麼機制來判斷當前會話遭遇了網路異常?

 

在這篇ORACLE的Dead Connection Detection淺析文章裡面, 我介紹了Linux系統下TCP KeepAlive概念,顧名思義,TCP keepalive它是用來保持TCP連接的,註意它只適用於TCP連接。系統會替你維護一個timer,時間到了,就會向remote peer發送一個probe package,當然裡面是沒有數據的,對方就會返回一個應答,這時你就知道這個通道保持正常。與TCP keepalive有關的三個參數tcp_keepalive_timetcp_keepalive_intvltcp_keepalive_probes

 

/proc/sys/net/ipv4/tcp_keepalive_time        keepalive起用的時候,TCP發送keepalive消息的頻度。預設是2小時。

/proc/sys/net/ipv4/tcp_keepalive_intvl      當探測沒有確認時,keepalive探測包的發送間隔。預設是75秒。

/proc/sys/net/ipv4/tcp_keepalive_probes     如果對方不予應答,keepalive探測包的發送次數。預設值是9

 

 

其實在Windows系統中也有類似的參數,分別是KeepAliveTimeKeepAliveIntervalTcpMaxDataRetransmissions

 

 

KeepAliveTime               預設是7,200,000 milliseconds = 2 hours

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

-Advertisement-
Play Games
更多相關文章
  • 目錄 · 概況 · 原理 · HDFS 架構 · 塊 · NameNode · SecondaryNameNode · fsimage與edits合併 · DataNode · 數據讀寫 · 容錯機制 · 數據完整性 · NameNode HA · NameNode Federation · HDF ...
  • 1. mysql是一種常用的資料庫管理軟體,優點有:免費,開源,跨平臺,本文只是介紹一下MySQL的簡單操作 2.資料庫的基本結構 可以把資料庫理解成一個文件夾,資料庫中的數據存放的單位是表,可以理解為excel表格,表格的表頭稱為欄位,表中的每一條數據稱為記錄 3.MySQL安裝 1.從官網下載  ...
  • SQLite doesn't support high concurrency. In case of a lot of concurrent access from multi-process or multi-thread, calling a SQLite r/w function is pr ...
  • 一、視圖的定義 視圖也稱為虛表,視圖本身不占用物理存儲空間,視圖存放於數據字典中,簡單的來說視圖可以看做是sql語句的集合。視圖從資料庫中的表產生,這些表稱為視圖的基表,一個視圖可以從另一個視圖中產生。 視圖看上去非常象資料庫的物理表,對它的操作同任何其它的表一樣。當通過視圖修改數據時,實際上是在改 ...
  • 本文介紹了MySQL Cluster的概念和架構,並通過幾個實例詳細討論了Cluster的配置方法,啟動關閉,常用維護方法的概念。 ...
  • 關於Apache Spark "Why Apache Spark" "關於Apache Spark" "如何安裝Apache Spark" " Apache Spark的工作原理" "spark彈性分散式數據集" "RDD持久性" "spark共用變數" "Spark SQL" "Spark Str ...
  • 前言 最近在一次面試中,討論了一個這樣的問題:主鍵和索引有什麼區別?當時我的回答是這樣的:“主鍵就是加了唯一性約束的聚集索引。” “你確定你所說的是對的?” 面試官反問到。 “應該是對的。” 我不加思索地回答道。 “你回去後研究一下這個問題吧。” 難道我真的錯了? 第一次嘗試 當問題出現時,請用事實 ...
  • 1. 神經網路基礎知識 1.1 神經元 神經網路(Neural Net)是由大量的處理單元相互連接形成的網路。神經元是神經網路的最小單元,神經網路由若幹個神經元組成。一個神經元的結構如下: 上面的神經元x1,x2,x3和1是輸入,hw,b(x)是輸出。 其中f(x)是激活函數,常用的激活函數有sig ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...