資料庫知識點、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.其餘要求和兩段鎖協定要求相同