數據庫原理及應用【四】數據庫管理系統

查詢優化

數據庫管理系統中非常重要的一部分。

代數優化

按照一定的規則將語句變化成關系代數以后進行優化

操作優化

對代數優化后的查詢樹使用比較好的方法進行查詢。
主要是對連接運算進行優化

  • 嵌套循環
  • 歸并掃描
  • 索引優化
  • 哈希連接

恢復機制

備份(完整備份+差異備份)+日志

事務

  • A:原子性
  • C:保持一致性
  • I:隔離性
  • D:持久性

事務的特性由DBMS負責維護,因此對于需要使用事務來進行執行的SQL語句,我們要定義在事務中。

如果沒有顯式地創建事務,那么DBMS會把每一條語句當作一個事務。

恢復信息

日志存儲在非揮發存儲器中。

  • Commit list:已經提交的TID的列表
  • Active list:進程中的TID列表
  • Log:更新前和更新后的信息。存儲的是修改前后的物理塊的值

提交(commit)規則:在提交事務之前修改后的數據A.I必須寫到非揮發存儲器中

先記后寫(log ahead)規則:在修改數據前必須把被修改數據的舊值B.I寫到日志中

操作:

  • 還原undo
  • 重做redo
    這兩種操作具有冪等性:一次和和好多次是相等的

更新策略

A.I->DB before commit

TID->active list

B.I->Log
A.I->DB

TID->commit list
delete TID from active list
如果發生故障會啟動重啟動恢復:檢查TID目前所處的狀態

Commit listActive listOperation
NoYesundo,delete TID from active list
YesYesdelete TID from active list
YesNonothing to do

為了避免每次檢查都需要檢查所有的TID,使用檢查點。
檢查點(check point):運行一段時間以后進行一次檢查,并且設立一個檢查點。每次檢查檢查上一次檢查點以后的TID

A.I->DB after commit

TID->active list

A.I -> Log

TID->commit list
ALL:A.I -> DB
delete TID from active list

重啟動恢復:

Commit listActive listOperation
NoYesdelete TID from active list
YesYesredo, delete TID from active list
YesNonothing to do

這種策略的并發度更高。可以推遲加排他鎖的時間。

A.I -> DB concurrently with commit

TID -> active list

A.I,B.I -> log

A.I->DB(partially done by 后臺進程 when hard disk is free)

TID->commit list
A.I->DB(completed)
delete TID from active list

重啟動恢復:

Commit listActive listOperation
NoYesundo, delete TID from active list
YesYesredo, delete TID from active list
YesNonothing to do
總結
redoundo
A.I->DB before commitNoYes
A.I->DB after commitYesNo
A.I->DB concurrently commitYesYes
異地更新(有缺點,沒有被推廣)NoNo

并發控制

并發:支持多個事務同時訪問數據庫
原因:

  • 改善系統的利用率
  • 不同的事務很可能訪問的是不同的數據,互不沖突

并發控制:對事務的并發運行加以管理

任意并發的后果:

  • 丟失更新:寫-寫沖突
  • 讀臟數據->恢復時的多米諾現象:寫-讀沖突
  • 不可重復的讀:讀-寫沖突

可串行化:并發運行事務以后的結果如果和某種串行運行的結果相同,則說這種并發運行是可串行化的,即是正確的。

如果用戶把一些事務同時提交并發運行,則要求這些事務誰先運行后運行是無所謂的,即默認所有可串行化的結果都是正確的。

并發控制策略

通過并發控制使得并發事務的運行是可串行化的

封鎖法

通過鎖對事務強行串行化

  • X鎖協議(排他鎖)

定義1:在一個事務里面,如果所有的加鎖請求都在鎖釋放之前,稱這個事務是一個兩階段事務,符合兩階段加鎖協議。(增長階段-縮減階段)
定義2:先得到鎖再訪問數據對象,那么這個事務就是well-formed(合式的)
定義:如果每個事務是合式的兩階段事務,那么這些事務一定是可串行化的。
如果事務是合式的并且是兩階段事務,并且在事務結束的時候釋放更新鎖,那么這個事務是可串行化的、可恢復的。不會出現恢復的時候的多米諾效應
如果在事務結束的時候釋放所有的鎖,那么稱這個事務滿足嚴格的兩階段加鎖協議。

NLX
NLYY
XYN

數據庫效率比較低。

  • SX鎖協議
    S(hare) lock :如果是讀操作
    X lock:如果是更新操作
NLSX
NLYYY
SYYN
XYNN
  • S(share)U(update)X locks
NLSUX
NLYYYY
SYYYN
UYYNN
XYNNN

系統的并發度較高。

死鎖/活鎖(饑餓)
在這里插入圖片描述
活鎖/饑餓:優化調度策略

死鎖:
  • 防:防止出現死鎖
  • 治:出現死鎖以后能夠解決死鎖。
治:
  • 當事務獲得鎖以后的等待時候超過一個限度以后就判定已經發生了死鎖,就重啟事務。對于時間的設置影響系統的運行效率
  • 構造等待圖
    節點:等待的事務
    邊:等待關系
    如果在等待圖里面出現環就說明出現死鎖。

檢查時機:每次出現新的等待關系的時候/周期檢查
解決方法:選擇一個犧牲者(目前擁有鎖最小的/滾回代價最小的事務)。然后等待環路上的其他事務都運行結束以后再運行該事務。

操作系統中的解決方案:

  • 檢查所需要的所有資源
  • 給資源進行排序

在數據庫系統中不現實

多粒度加鎖

  • 一旦遇到得不到鎖就終止,不等待就不會死鎖
  • 事務重試:給每一個事務安排一個時間戳
    • 當作TID
    • 比較兩個事務的年齡

等待死亡協議
如果Ta需要申請一個鎖,這個鎖已經被Tb占領了:

  • 如果Ta比Tb年老,則Ta進行等待
  • 如果Ta比Tb年輕,則自己終止,然后自動重新運行(以原來的時間戳)

因此不可能重現循環等待,解決了死鎖和活鎖問題
受傷等待協議
如果Ta需要申請一個鎖,這個鎖已經被Tb占領了:

  • 如果Ta比Tb年輕,則Ta進行等待
  • 如果Ta比Tb年老的話,則將Tb終止

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383608.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫原理及應用【五】安全性和完整性約束

數據庫一致性被破壞: 系統故障許多用戶的并發訪問人為破壞事務本身不正確 保護數據庫一致性的方法: 視圖/查詢修改訪問控制 普通用戶擁有資源特權的用戶DBA 數據庫的安全問題 身份驗證 口令物理設備 GRANT CONNECT TO John IDENTIFIED BY 123456…

遞歸式復雜度求解

代換法 猜測復雜度驗證是否滿足遞歸式(使用歸納法)找到常數應該滿足的條件針對基本情況,常數足夠大時總是成立的 需要注意的是,我們猜測的復雜度有可能不滿足遞歸式,這個時候就要通過減去一些低階項來使得歸納成立。…

斐波那契數列計算

定義 斐波那契數列: F[n]{0,n01,n1F[n?1]F[n?2],elseF[n] \begin{cases} 0,n0 \\ 1,n1\\ F[n-1]F[n-2],else \end{cases} F[n]??????0,n01,n1F[n?1]F[n?2],else? 樸素計算法 根據遞歸式F[n]F[n?1]F[n?2]F[n]F[n-1]F[n-2]F[n]F[n?1]F[n?2]進行計算…

P、NP、NP完全問題、NP難問題

可以在多項式時間內求解的問題稱為易解的,而不能在多項式時間內求解的問題稱為難解的。 P類問題:多項式類型,是一類能夠用(確定性的)算法在多項式的時間內求解的判定問題。 只有判定問題才屬于P 不可判定問題&#…

數據可視化【十】繪制地圖

Loading and parsing TOPOJSON 導入Topojson d3文件 地址:https://unpkg.com/topojson3.0.2/dist/topojson.min.js 想要找d3文件的話去unpkg.com好像大部分都能找到的樣子 Rendering geographic features 尋找合適的地圖數據:谷歌搜索world-atlas npm…

數據可視化【十一】樹狀圖

Constructing a node-link tree visualization 首先將節點之間的連線畫出來。 使用json函數讀取文件以后,使用hierarchy等函數得到連線的數組,然后綁定這個數組,給每個元素添加一個path,繪畫使用的是一個函數linkHorizontal&…

數據可視化【十二】 顏色圖例和尺寸圖例

有了前面的知識,制作一個圖例應該不是很難,關鍵是我們想要制作一個可以在其他地方進行使用的圖例,這樣就需要能夠動態地設置圖例的大小,位置,等等。 這里直接上代碼: colorLegend.js export const color…

數據可視化【十三】地區分布圖

在前面的博客中已經介紹了如何繪制地圖,這一節學習如何繪制地區分布圖。如果對繪制地圖還不熟悉的話可以了解一下之前我寫的博客:數據可視化【十】繪制地圖 Intergrating(整合) TopoJSON with tabular data(列表數據) 在前面的博客中沒有使用到tsv文件…

3.01【python正則表達式以及re模塊】

python正則表達式以及re模塊 元字符 正則表達式的語法就由表格中的元字符組成,一般用于搜索、替換、提取文本數據 元字符含義.匹配除換行符以外的任何單個字符*匹配前面的模式0次或1次匹配前面的模式1次或多次?匹配前面的模式0次或1次[]用于定義字符集&#xff…

Linux配置編程環境+云服務器上傳文件

Java環境配置 Ubuntu https://www.cnblogs.com/lfri/p/10437266.html Centos https://blog.csdn.net/qq_21077715/article/details/85536399 Tomcat配置 Centos https://blog.csdn.net/qq_21077715/article/details/85541685 https://www.cnblogs.com/newwind/p/9904561…

gbd + cgbd

gbd:傳送門 cgbd:傳送門 | 傳送門

數據可視化【十四】交互式過濾地區分布圖

在前面的博客中已經介紹了如何繪制地區分布圖,這一節學習如何繪制交互式過濾地區分布圖。如果對繪制地區分布圖還不熟悉的話可以了解一下之前我寫的博客:數據可視化【十三】地區分布圖 整體的框架仍然是在之前的基礎上進行修改,主要是添加交…

Ubuntu環境搭建

本文記錄了一些常用的Ubuntu軟件 然后首先修改軟件源:軟件和更新->Ubuntu軟件->下載自:其他站點(修改為阿里云) 在關閉的時候需要更新什么的 然后修改更新方式,將不支持的更新去掉 常用的Windows軟件 網易云…

1 兩數之和

雖然只是一道很簡單的題,但是也給我很多思考。 剛看到這道題的時候沒有仔細思考,直接寫了個排序和二分查找,想著對每個數字查找另一個數字會不會出現,復雜度是O(nlognnlogn)O(nlognnlogn)O(nlognnlogn),主要訓練了一下…

834 樹中距離之和

這道題我自己的想法只有對每個點都用一遍Dijkstra然后再求和,顯然會超時,所以我都沒有嘗試。 研究了一下題解,發現題解很巧妙,自己對樹的處理還是太稚嫩,之前樹鏈剖分學的都忘光了。 對于固定根節點的,我…

75 顏色分類

題目已經提示可以一遍掃描了但是我還是沒有想到,其實雙指針的想法我已經有了,但是一想到有問題就覺得無法實現。這也揭示了我思維上的問題:用一種方法解決問題遇到困難第一件事情不是想著如何攻克而是想著換一種方法。對自己的思維也不自信。…

141 環形鏈表

要求使用空間復雜度為O(1)的方法,可是我并沒有想到。我想到的只有用一個哈希表記錄一下所有訪問過的節點。 題解給出的空間復雜度為O(1)的方法是使用兩個指針,然后讓一個一次跑一步,一個一次跑兩步,如果跑的快的能追上跑的慢的就…

數據可視化【十五】

經驗法則:在顏色不相鄰的時候加上背景顏色顏色的個數為6~12比較好。 顏色其實很大程度上由背景決定而不是他本身決定。 D3 Scale-Chromatic 有許多顏色刻度,可以根據自己的需要進行選擇。 參考論文:Practical Rules for Using Color in Cha…

Ubuntu修改/刪除主目錄下的中文文件夾

在Ubuntu的主目錄下一般是有一些中文的目錄,例如桌面,視頻等等,還無法修改名稱,在一群英文文件夾里面顯得有些突兀(Ubuntu終端下的中文一點也不好看),就想把這些文件夾修改一下,結果…

19 刪除鏈表的倒數第N個

題目的意思很簡單,就是刪除一個鏈表倒數第N個節點。 需要用到鏈表的標準操作:快慢指針。 我們讓一個快指針先指向第N個元素,這個時候快指針總比慢指針領先N個元素,等到快指針指向鏈表尾部的時候慢指針就指向需要刪除的元素。 之前…