天天看點

資料庫知識點②

資料庫知識點、ACID、兩端鎖協定、嚴格的兩段鎖協定

1.ECA (Event-Condition-Action)

事件觸發規則 trigger [行級或語句級; 幾個事件的組合; 觸發條件為真]

2.ACID

①Atomicity requirement 原子性要求

簡單地說就是:要麼同時拒絕,要麼同時成功。

  還是舉個實在一點的例子:

  (小菜剛寫了轉賬系統,想在想試試)

  小菜:既然你教給我這麼多設計模式,還是要給些錢吧。我有個賬戶8888*********8888,大鳥你的賬戶是啥?我給你轉錢

  大鳥:那就轉這個賬戶吧 6666*********6666,

  (在轉賬操作中的小菜)

  小菜:完了,停電了。我剛轉出去,你等會上去看看有沒有轉到。

  (過了一分鐘)

  大鳥:沒有呀。

  小菜:玩完了。

根據這個例子抽象出來原子性:一個事務包含多個操作,這些操作要麼全部執行,要麼全都不執行。實作事務的原子性,要支援復原操作,在某個操作失敗後,復原到事務執行之前的狀态。

②Consistency requirement 一緻性需求

一緻性,即在事務開始之前和事務結束以後,資料庫的完整性限制沒有被破壞。(完整性規則、參照完整性規則、自定義完整性規則[Check限制或者trigger觸發器])

③Isolation requirement 隔離性要求

舉個常見的例子

在Windows中,如果多個程序對同一個檔案進行修改是不允許的,Windows通過這種方式來保證不同程序的隔離性:

資料庫知識點②

 而SQL Server中,通過SQL SERVER對資料庫檔案進行管理,進而可以讓多個程序可以同時通路資料庫,為此SQL Server為了解決線程之間的沖突,設定了鎖協定。

④Durability requirement 持久性要求

  持久性是指一個事務一旦被送出,它對資料庫中資料的改變就是永久性的,接下來的其他操作和資料庫故障不應該對其有任何影響。即一旦一個事務送出,DBMS(Database Management System)保證它對資料庫中資料的改變應該是永久性的,持久性通過資料庫備份和恢複來保證。

  意味着在事務完成之後,該事務對資料庫所做的更改便持久的儲存在資料庫之中,并不會被復原。

  資料庫實作持久性的原理:SQL server 通過 write-ahead-transaction-log 來保證資料的持久性。write-ahead-transaction-log的意思是:事務中對資料庫的改變在寫入資料庫之前,首先寫入到事務日志中。而事務日志是按照順序号進行排序的(LSN),當資料庫崩潰或者伺服器斷電時,重新啟動SQL Server,SQL Server 首先會檢查日志順序号,将本應對資料庫做更改而未做的部分持久化到資料庫中,進而保證了持久性。

 ⑤SQL Server通過利用加鎖和阻塞來保證事物之間不同等級的隔離性

  事務之間的互相影響可分為:髒讀(Dirty Read)、不可重複讀(no-repeated Read)、幻讀(Phantom Read)

1.髒讀:

  一個事務讀取到了另一個事務未送出的資料,而這個資料有可能是在之後會被復原的。

舉個例子:

甲将A賬戶的錢轉到B賬戶,同時乙在此時對B賬戶餘額進行查詢。

從A賬戶取出$1000

轉給B賬戶

讀取餘額,發現甲已經向自己轉賬

甲發現轉的金額有錯,

便執行了復原,取消了

之前的操作

 2.不可重複讀:

  在資料庫通路中,一個事務範圍内的兩個相同查詢卻傳回了不同資料,這是由于查詢時系統中其他事務修改的送出而引起的。

甲和乙同時對A賬戶進行操作。

讀取賬戶餘額

存入$1000

前後兩次乙的讀取操作得到的賬戶餘額不相同,隻就叫做不可重複讀。(因為乙重複讀了賬戶餘額,發現了不同,可能是這樣才叫做不可重複讀吧)

3.幻讀(Phantom Read)

指事務不是獨立執行時發生的一種現象,例如第一個事務删除某一行全部資料,第二個事務添加了一行新資料,好像沒有修改一樣,出現了幻讀。

⑥了解SQL Server中的隔離等級

  為了避免幾個事務之間的影響,SQL Server通過設定不同的隔離等級來進行不同的避免,因為高的隔離等級意味着更多的鎖,進而犧牲性能。

  SQL Server提供了5中隔離,隔離等級由低到高分别為:

Read Uncommited(最高性能,但可能出現髒讀,不可重複讀,幻讀)

Read Commited (符合99%實際需求,可能出現不可重複讀,幻讀)

Repeatable Read(可能出現幻讀)

Serializable (最低性能,Range鎖會導緻并發下降)

SNOPSHOT(SQL Server中不涉及到的,并不常用)

⑦好的排程:

1.ACID的可串行化

2.可恢複的排程

3.無級聯的復原

⑧并發控制:增加合理的等待

1.Locking:為事務加上鎖,

  鎖的協定,什麼時候加,什麼時候釋放,遇到鎖什麼反應

2.Time-Stamping

3.Optimistic 積極考慮

 假設施加在資料庫上的操作大多數并不沖突

⑨Shared locks共享鎖 AND Exclusive locks排它鎖 

兩種鎖之間的存在矩陣:

S

X

Yes

No

⑩鎖協定:兩段鎖協定 Two-Phase-locking

1.鎖定階段(Growing Phase):把所有要鎖定的資料全部加鎖,

2.釋放階段(Shrinking):當開始釋放鎖時,不能再加上其他的鎖,隻能不斷将之前加上的鎖解開。

  嚴格的兩段鎖協定 Strict 2PL 

1.所有的事務,其所擁有的全部鎖隻能在所有事務執行完時,才能進行釋放(commit/rollback操作之後)

2.其餘要求和兩段鎖協定要求相同