日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

检查点(Checkpoint)过程如何处理未提交的事务

發(fā)布時(shí)間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 检查点(Checkpoint)过程如何处理未提交的事务 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

每次我講解SQL Server之前,我都會(huì)先簡(jiǎn)單談下當(dāng)我們執(zhí)行查詢時(shí),在SQL Server內(nèi)部發(fā)生了什么。執(zhí)行一個(gè)SELECT語(yǔ)句非常簡(jiǎn)單,但是執(zhí)行DML語(yǔ)句更加復(fù)雜,因?yàn)镾QL Server要修改內(nèi)存中的相關(guān)頁(yè),并在事務(wù)日志里記錄整個(gè)事務(wù)。

介紹完這些特定步驟后,我總會(huì)問同樣的問題:當(dāng)我們有個(gè)未提交的事務(wù),這個(gè)時(shí)候剛好有檢查點(diǎn)(Checkpoint)發(fā)生,SQL Server會(huì)崩潰么?在我們數(shù)據(jù)文件里有我們未提交的數(shù)據(jù)么?先思考下,然后再寫下你的答案。

創(chuàng)建測(cè)試場(chǎng)景

現(xiàn)在我想和你一起重建這個(gè)特定場(chǎng)景,最后你會(huì)看到你是否回答對(duì)了。這個(gè)場(chǎng)景的第一步,我創(chuàng)建了一個(gè)新的數(shù)據(jù)庫(kù),一個(gè)新的表,并插入一些記錄。

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

在我們插入數(shù)據(jù)后,我想知道SQL Server存儲(chǔ)特定記錄的頁(yè)號(hào)。我們可以使用DBCC IND命來來返回特定表的所有頁(yè)。在我的服務(wù)器上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

現(xiàn)在當(dāng)我們用DBCC PAGE命令輸出頁(yè)內(nèi)容時(shí)(使用這個(gè)命令前,要先啟用3604跟蹤標(biāo)記),我們可以看到插入的A,B,C的16進(jìn)制值。

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

現(xiàn)在當(dāng)我們進(jìn)行檢查點(diǎn)(Checkpoint)過程,并最終殺掉SQL Server會(huì)發(fā)生什么?未提交的數(shù)據(jù)會(huì)物理寫入數(shù)據(jù)文件么?我們來試驗(yàn)下...

崩潰并恢復(fù)SQL Server

現(xiàn)在我們開始一個(gè)新的事務(wù),并更新插入記錄的第一列。

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

從代碼里你可以看到,我們并沒有提交這個(gè)事務(wù)!它還是待定的,未提交的事務(wù)。現(xiàn)在我們打開另一個(gè)會(huì)話,我們?nèi)藶檫M(jìn)行一次檢查點(diǎn)(Checkpoint)過程,并最終關(guān)閉SQL Server。

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

現(xiàn)在你認(rèn)為未提交的事務(wù)已經(jīng)寫入數(shù)據(jù)文件了么?不確定?我們來找出答案!我們?cè)?6進(jìn)制的編輯器(例如XVI32)里打開數(shù)據(jù)文件。跳到頁(yè)號(hào)79的開始。在數(shù)據(jù)文件里,頁(yè)號(hào)是物理偏移量,即頁(yè)開始的地方——乘上8192字節(jié),因?yàn)樵赟QL Server里頁(yè)的大小是8kb。因此頁(yè)79的開始整數(shù)偏移量是647168(79*8192).當(dāng)我們查看hex值時(shí),我們看到了我們未提交的數(shù)據(jù)。

檢查點(diǎn)(Checkpoint)過程不會(huì)區(qū)分提交和未提交的事務(wù)。它只會(huì)到緩存管理器(Buffer Manager)索取所有臟頁(yè),不管它們事務(wù)的狀態(tài)。

現(xiàn)在我們有不一致,損壞的數(shù)據(jù)庫(kù)了么?沒有,并不真的是。因?yàn)楝F(xiàn)在當(dāng)我們啟動(dòng)SQL Server,每個(gè)數(shù)據(jù)庫(kù)都經(jīng)過故障恢復(fù)階段,所有沒提交的事務(wù)都會(huì)回滾。當(dāng)SQL Server啟動(dòng)的時(shí)候,我們可以在SQL Server日志里看到這個(gè)行為:

小結(jié)

檢查點(diǎn)(Checkpoint)不會(huì)在意你的事務(wù)狀態(tài)。來自緩存池(Buffer Pool)的每個(gè)臟頁(yè)會(huì)寫入數(shù)據(jù)頁(yè)。如果SQL Server崩潰了也沒關(guān)系,因?yàn)楣收匣謴?fù)能恢復(fù)你的數(shù)據(jù)庫(kù)到完全一致的狀態(tài)。我希望這篇日志能讓你更好的理解檢查點(diǎn)(Checkpoint)過程,還有它如何與未提交的事務(wù)打交道。

作為家庭作業(yè),你能否留言告訴我,還有哪些情形,SQL Server需要運(yùn)行故障恢復(fù)為你的數(shù)據(jù)庫(kù)還原到一致狀態(tài)。在SQL Server里你知道多少個(gè)不同的場(chǎng)景呢?

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

轉(zhuǎn)載于:https://www.cnblogs.com/woodytu/p/5164359.html

總結(jié)

以上是生活随笔為你收集整理的检查点(Checkpoint)过程如何处理未提交的事务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。