欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

01. SQL Server 如何讀寫數據

系統 2004 0
原文: 01. SQL Server 如何讀寫數據

一. 數據讀寫流程簡要
SQL Server作為一個關系型數據庫,自然也維持了事務的ACID特性,數據庫的讀寫沖突由事務隔離級別控制。無論有沒有顯示開啟事務,事務都是存在的。流程圖如下:

01. SQL Server 如何讀寫數據
數據讀寫流程圖

0. 事務開始
(1) 所有DML語句必然是基于事務的,如果沒有顯式開啟事務,即手動寫下BEGIN TRAN,SQL Server則把每條語句作為一個事務,并自動提交事務。

也就是說SQL SERVER 默認不開啟隱式事務,這點與ORACLE正好相反,ORACLE默認開啟了隱式事務,每條DML語句或者語句塊,都要手動commit才會提交。

SQL Server里如要改變這個默認行為,可以在會話里做如下設置,如果沒有打開隱式事務,SQL Server會自動提交當前的DML語句,而打開后,需要手動COMMIT才會提交。

      
        --
      
      
        開啟隱式事務
      
      
        SET
      
       IMPLICIT_TRANSACTIONS 
      
        ON
      
      
        --
      
      
        插入一條記錄
      
      
        CREATE
      
      
        TABLE
      
       TEST_TRAN(ID 
      
        INT
      
      
        )


      
      
        INSERT
      
      
        INTO
      
       TEST_TRAN 
      
        VALUES
      
      (
      
        1
      
      
        )




      
      
        --
      
      
        查看開啟的事務
      
      
        DBCC
      
       OPENTRAN()
    

(2) 如果手動開啟了一個事務(BEGIN TRAN),則和開啟隱式事務(SET IMPLICIT_TRANSACTIONS ON)一樣,需要手動提交事務(COMMIT);

1. 發起DML
(1) DML通常指的是:INSERT、DELETE、UPDATE;
(2) DDL語句最終是被轉化為對系統表的DML,在SQL SERVER中DDL語句也可以被回滾,比如:CREATE/ALTER/DROP/TRUNCATE,在ORACLE里是不可以的,另外SQL Server中的DCL語句:DENY,REVOKE,也可以被回滾;

2. 數據是否在內存
(1) 在內存中使用HASH算法查找數據,如果找到數據那么記為邏輯讀;
(2) 如果數據頁不在內存中,則需要從磁盤上的數據文件中,讀取相應的數據頁到內存中,即物理讀,物理讀也會被記數為邏輯讀,也就是說無論內存中有沒有數據,邏輯讀是一定有的。

3. 修改數據
(1) 在SQL SERVER內存的數據緩沖區中將數據頁修改,此時數據頁稱為臟頁(DIRTY PAGE);
(2) 在SQL SERVER內存的日志緩沖區中記錄REDO LOG,姑且稱為臟日志;

4. 事務結束
(1) 提交(COMMIT),此時將當前事務的臟日志刷新到數據庫的日志文件中,并打上事務結束標記(COMMIT),臟頁有可能暫未被刷新到數據文件;
事務日志結構如下(可通過log explorer等類似工具查看):
BEGIN TRAN
DML
COMMIT TRAN

(2) 回滾(ROLLBACK),此時讀REDO LOG得到反向DML操作,反向修改臟頁,正向的DML+反向DML都會被記錄在數據庫的日志文件中,并打上事務結束標記(ROLLBACK),同樣,臟頁有可能暫未被刷新到數據文件;
事務日志結構如下:
BEGIN TRAN
DML
反向DML
ROLLBACK TRAN

不難發現,SQL SERVER的日志容易成為一個瓶頸(BOTTLENECK),因為在寫的同時引入了讀,即引入了競爭,而ORACLE用UNDO SEGMENT很好地避免了這個問題,REDO LOG永遠只是在被串行寫。

5. 刷新數據頁
(1) SQL Server數據庫遵循預寫日志(WAL:Write-Ahead Logging)原則,因為關系型數據庫是基于事務的,而日志正是事務ACID屬性的保證,也是數據恢復的保證;
(2) 檢查點(CHECKPOINT),檢查點周期性地將臟頁刷新到數據文件中,最終在日志文件打上檢查點標記(CHECKPOINT),至此上面事務中修改的數據被正式寫到磁盤上的數據文件中。

二. 數據讀寫流程深入
試想:
(1) 日志是不是一定要在COMMIT后才寫到日志文件?如果有個很長很大的事務,那么提交日志時,日志從緩沖區被寫入磁盤,豈不是要等很久?
(2) 數據是不是一定要在日志提交后,發生了CHECKPOINT,才寫到數據文件?如果日志一直沒提交,那么數據緩沖區豈不是很擁擠?

考慮到這2點,SQL Server還會通過Log Writer/Lazy Writer不定時的刷新日志/數據到磁盤,至于日志和數據的一致性,在啟動或者數據庫還原時,SQL Server會去做檢查,也即是我們常說的前滾(REDO)和回滾(UNDO)。

01. SQL Server 如何讀寫數據
數據讀寫體系結構圖


0. SQL SERVER MEMORY
(1) SQL SERVER占用服務器內存的一部分,非SQL SERVER占用的內存,供操作系統及服務器上其他應用程序使用;
(2) SQL SERVER內存對象可分為兩大類,圖中僅標出Buffer Pool中的數據及日志緩存;

1. 事務結束
(1) 事務結束的前提是日志緩存成功寫入到日志文件中,也就是說客戶端收到COMMIT/ROLLBACK語句運行成功的消息時,日志已被成功寫入日志文件(數據還不定是否被寫入數據文件);
(2) 不過,日志緩存并不是一定要等到事務結束時才刷新到日志文件的;

2. LOG WRITER
(1) 當遇到長事務時,不必等到發出事務結束命令,LOG WRITER也會周期性地將臟日志刷新到日志文件,以保證用戶發出COMMIT時快速響應以結束事務;
(2) 微軟并沒有公布SQL SERVER 除去COMMIT外,LOG WRITER將臟日志刷新到日志文件的周期,這里可以參考ORACLE的:每3秒,或者日志緩沖區1/3滿;或者已經包含1M的臟日志;

3. LAZY WRITER
(1) LAZY WRITER周期性掃描緩存(默認1s),維護自由頁面(free page)列表,根據LRU算法將已刷新到磁盤的頁釋放;
(2) 如果是臟頁,則Lazy Writer將臟頁刷新到磁盤(這時事務可能還未提交),以最終將內存頁釋放并加入自由頁面列表;

4. CHECKPOINT
(1) CHECKPOINT同LAZY WRITER一樣也會刷新臟頁到數據文件中(只刷新已提交的事務數據),但不會維護內存自由頁面列表;
(2) 可以設置SP_CONFIGURE ‘RECOVERY INTERVAL’選項來改變CHECKPOINT發生的頻率,默認為1分鐘一次。

小結 :可以發現,數據和日志被寫入數據/日志文件,并不是同步的。有可能寫入/提交了日志,數據沒有寫入磁盤;有可能寫入了數據,事務未被提交;
(1) 針對有完整事務日志,數據未被寫入磁盤的情況,啟動/還原數據庫時,SQL SERVER做前滾(REDO);
(2) 針對有數據寫入數據文件,日志未完整提交的事務,啟動/還原數據庫時,SQL SERVER做回滾(UNDO)。

?

01. SQL Server 如何讀寫數據


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 天天射天天搞 | 免费看一级视频 | 91毛片网站| 91视频久久 | 国产精品岛国久久久久久 | aⅴ色国产 欧美 | 亚洲 日本 欧美 中文幕 | 欧美99 | 亚洲国产中文字幕 | 99re在线 | 日韩欧美在线视频不卡免费视频 | 一级视频免费观看 | 亚洲视频一区在线观看 | 天天在线综合网 | 亚洲精品国产网红在线 | 91丨九色丨首页在线观看 | 国产美女一区二区三区 | 亚洲最黄网站 | 国产成人无码AA片免费看 | 在线国产一区 | 午夜寂寞少妇aaa片毛片 | 成人免费看黄网站yyy456 | 国产精品成人va在线观看入口 | 成人国产激情福利久久精品 | 蜜桃视频一区 | 国产丝袜在线 | 中文字幕视频在线 | 精品人妻无码一区二区三区手机板 | av免费在线观看av | 欧美一级久久久久久久久大 | 欧美国产高清 | 波多野结衣免费视频观看 | 欧美黑人疯狂性受xxxxx喷水 | 亚洲精品成人 | 午夜色站 | 亚洲午夜精品视频 | 欧美午夜视频 | 99精品一区二区免费视频 | 久久久噜噜噜久久中文字幕色伊伊 | 日本精高清区一 | 精品成人一区 |