檢查點(Checkpoint)過程如何處理未提交的事務

来源:http://www.cnblogs.com/woodytu/archive/2016/01/28/5164359.html
-Advertisement-
Play Games

每次我講解SQL Server之前,我都會先簡單談下當我們執行查詢時,在SQL Server內部發生了什麼。執行一個SELECT語句非常簡單,但是執行DML語句更加複雜,因為SQL Server要修改記憶體中的相關頁,併在事務日誌里記錄整個事務。 介紹完這些特定步驟後,我總會問同樣的問題:當我們有個未


每次我講解SQL Server之前,我都會先簡單談下當我們執行查詢時,在SQL Server內部發生了什麼。執行一個SELECT語句非常簡單,但是執行DML語句更加複雜,因為SQL Server要修改記憶體中的相關頁,併在事務日誌里記錄整個事務。

介紹完這些特定步驟後,我總會問同樣的問題:當我們有個未提交的事務,這個時候剛好有檢查點(Checkpoint)發生,SQL Server會崩潰麽?在我們數據文件里有我們未提交的數據麽?先思考下,然後再寫下你的答案。

創建測試場景

現在我想和你一起重建這個特定場景,最後你會看到你是否回答對了。這個場景的第一步,我創建了一個新的資料庫,一個新的表,並插入一些記錄。

 1 -- Create a new database
 2 CREATE DATABASE Checkpointing
 3 GO
 4 
 5 -- Use it
 6 USE Checkpointing
 7 GO
 8 
 9 -- Create a new table
10 CREATE TABLE Foo
11 (
12     Col1 CHAR(100) NOT NULL,
13     Col2 CHAR(100) NOT NULL,
14     Col3 CHAR(100) NOT NULL
15 )
16 GO
17 
18 -- Insert a record
19 INSERT INTO Foo VALUES
20 (
21     REPLICATE('A', 100),
22     REPLICATE('B', 100),
23     REPLICATE('C', 100)
24 )
25 GO
26 
27 -- Retrieve the record
28 SELECT * FROM Foo
29 GO

在我們插入數據後,我想知道SQL Server存儲特定記錄的頁號。我們可以使用DBCC IND命來來返回特定表的所有頁。在我的伺服器上SQL Server使用的Page id是79。

1 -- Retrieve the first data page for the specified table (columns PageFID and PagePID)
2 DBCC IND(Checkpointing, Foo, -1)
3 GO

現在當我們用DBCC PAGE命令輸出頁內容時(使用這個命令前,要先啟用3604跟蹤標記),我們可以看到插入的A,B,C的16進位值。

1 -- Enable DBCC trace flag 3604
2 DBCC TRACEON(3604)
3 GO
4 
5 -- Dump the first data page of the table Customers retrieved by DBCC IND previously
6 DBCC PAGE (Checkpointing, 1,79, 3)
7 GO

現在當我們進行檢查點(Checkpoint)過程,並最終殺掉SQL Server會發生什麼?未提交的數據會物理寫入數據文件麽?我們來試驗下...

崩潰並恢復SQL Server

現在我們開始一個新的事務,並更新插入記錄的第一列。

1 -- Begin a new transaction without committing it...
2 BEGIN TRANSACTION
3 
4 UPDATE Foo
5 SET Col1 = REPLICATE('X', 100)

從代碼里你可以看到,我們並沒有提交這個事務!它還是待定的,未提交的事務。現在我們打開另一個會話,我們人為進行一次檢查點(Checkpoint)過程,並最終關閉SQL Server。

1 -- Execute it in a different session
2 CHECKPOINT
3 GO
4 
5 SHUTDOWN WITH NOWAIT
6 GO

現在你認為未提交的事務已經寫入數據文件了麽?不確定?我們來找出答案!我們在16進位的編輯器(例如XVI32)里打開數據文件。跳到頁號79的開始。在數據文件里,頁號是物理偏移量,即頁開始的地方——乘上8192位元組,因為在SQL Server里頁的大小是8kb。因此頁79的開始整數偏移量是647168(79*8192).當我們查看hex值時,我們看到了我們未提交的數據。

檢查點(Checkpoint)過程不會區分提交和未提交的事務。它只會到緩存管理器(Buffer Manager)索取所有臟頁,不管它們事務的狀態。

現在我們有不一致,損壞的資料庫了麽?沒有,並不真的是。因為現在當我們啟動SQL Server,每個資料庫都經過故障恢復階段,所有沒提交的事務都會回滾。當SQL Server啟動的時候,我們可以在SQL Server日誌里看到這個行為:

小結

檢查點(Checkpoint)不會在意你的事務狀態。來自緩存池(Buffer Pool)的每個臟頁會寫入數據頁。如果SQL Server崩潰了也沒關係,因為故障恢復能恢復你的資料庫到完全一致的狀態。我希望這篇日誌能讓你更好的理解檢查點(Checkpoint)過程,還有它如何與未提交的事務打交道。

作為家庭作業,你能否留言告訴我,還有哪些情形,SQL Server需要運行故障恢復為你的資料庫還原到一致狀態。在SQL Server里你知道多少個不同的場景呢?

參考文章:https://www.sqlpassion.at/archive/2016/01/25/how-the-checkpoint-process-deals-with-uncommitted-transactions/


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

-Advertisement-
Play Games
更多相關文章
  • 前陣子搞了下資料庫同步,大概意思就是伺服器上有一個資料庫,與本地資料庫進行同步,伺服器上的資料庫有什麼改變,可以同步到本地資料庫中。做之前百度了下,流程分以下三步, 第一步: 伺服器上的資料庫進行發佈 第二步: 本地資料庫進行訂閱 第三步: 把冰箱門關上 看起來很簡單,實際上遠不是這麼一回事,把哥都
  • 有一張資金記錄表,一張金幣記錄表,想以時間為單位,降序合併排列他們之間的信息,查詢SQL如下:select * from (select * from t_money_logs union select * from t_gold_logs) as c order by create_time de
  • pg_dump 是一個用於備份PostgreSQL資料庫的工具. 該工具生成的轉儲格式可以分為兩種, 腳本 : 其中腳本格式是包含許多SQL命令的純文本格式 (常用) 歸檔文件: 需要重建資料庫就必須和pg_restore工具一起使用 下麵按照這兩種方式進行備份恢復操作。 環境簡介: 操作對象:數據
  • mysql 命令導入sql腳本數據
  • 1、為查詢優化你的查詢 大多數的MySQL伺服器都開啟了查詢緩存。這是提高性最有效的方法之一,而且這是被MySQL的資料庫引擎處理的。當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個緩存中,這樣,後續的相同的查詢就不用操作表而直接訪問緩存結果了。 這裡最主要的問題是,對於程式員來說,這
  • 回到目錄 之前寫過相關的文章,對臟讀,不可重覆讀,幻讀都做了相當的研究,而今天在程式中又出現了這個問題,即當一條數據被update時,另一個線程同時發起了讀的操作,這對於序列化級別的事務是不被允許的,正常情況下它應該被阻塞,當事務消失時,數據從新被讀取。 一些術語-來自百度百科 更新丟失 兩個事務都
  • sqlite是一個很小巧的,很方便嵌入到腳本語言中的,關係型資料庫。它給powershell提供了一個免費的,處理行列整齊數據,存儲數據,統計數據的極品神器。本文分享了powershell操作sqlite的例子和技巧。
  • <!-- /* Font Definitions */ @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0;} @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...