死鎖mysql
四個必要條件linux
fork()進程數ios
數據庫中事務相關內容算法
事務定義 :數據庫事務是構成單一邏輯工做單元的操做集合sql
BEGIN TRANSACTION //事務開始 SQL1 SQL2 COMMIT/ROLLBACK //事務提交或回滾
特性 :acid數據庫
a(Atomicity) 原子性 跟鎖仍是有區別,能夠兩個事務同時處理同一個資源,可是每一個事務的全部操做必需要麼都成功,要麼都失敗。ubuntu
c(Consistency)一致性(能量守恆):事務的執行結果必須使數據庫從一個一致性狀態到另外一個一致性狀態。一致性狀態是指:1.系統的狀態知足數據的完整性約束(主碼,參照完整性,check約束等) 2.系統的狀態反應數據庫本應描述的現實世界的真實狀態,好比轉帳先後兩個帳戶的金額總和應該保持不變。併發
i(Isolation)隔離性:併發執行的事務不會相互影響,其對數據庫的影響和它們串行執行時同樣。好比多個用戶同時往一個帳戶轉帳,最後帳戶的結果應該和他們按前後次序轉帳的結果同樣。性能
d(Durability)持久性:操作系統
事務併發的三個問題
髒讀:A事務對數據進行修改的過程當中,B事務讀取該數據,A事務對該數據進行回滾,那麼B事務讀到了髒數據。
在事務1對A的處理過程當中,事務2讀取了A的值,但以後事務1回滾,致使事務2讀取的A是未提交的髒數據。
不可重複讀:A事務屢次讀取一個數據,在此過程當中,B事務對該數據進行了修改並進行了提交,致使A事務讀取同一數據時卻讀到了不一樣數值。
因爲事務2對A的已提交修改,事務1先後兩次讀取的結果不一致。
幻讀 :幻讀,是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的所有數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,之後就會發生操做第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺同樣.(幻讀和不可重複讀的區別在於,不可重複讀是針對肯定的某一行數據而言,而幻讀是針對不肯定的多行數據。於是幻讀一般出如今帶有查詢條件的範圍查詢中,好比下面這種狀況:)
事務1查詢A<5的數據,因爲事務2插入了一條A=4的數據,致使事務1兩次查詢獲得的結果不同
事務的隔離級別
事務具備隔離性,理論上來講事務之間的執行不該該相互產生影響,其對數據庫的影響應該和它們串行執行時同樣。而徹底的隔離性會致使系統併發性能很低,下降對資源的利用率,於是實際上對隔離性的要求會有所放寬,這也會必定程度形成對數據庫一致性要求下降.
隔離級別從低到高依次是:讀未提交->讀已提交->可重複讀->串行化
併發控制技術
樂觀併發控制:對於併發執行可能衝突的操做,假定其不會真的衝突,容許併發執行,直到真正發生衝突時纔去解決衝突,好比讓事務回滾。
悲觀併發控制:對於併發執行可能衝突的操做,假定其一定發生衝突,經過讓事務等待(鎖)或者停止(時間戳排序)的方式使並行的操做串行執行。
基於鎖的併發控制
鎖一般分爲共享鎖和排他鎖兩種類型
1.共享鎖(S):事務T對數據A加共享鎖,其餘事務只能對A加共享鎖但不能加排他鎖。
2.排他鎖(X):事務T對數據A加排他鎖,其餘事務對A既不能加共享鎖也不能加排他鎖
對於可能發生衝突的併發操做,鎖使它們由並行變爲串行執行,是一種悲觀的併發控制。
故障恢復技術
- 事務故障:好比非法輸入,系統出現死鎖,致使事務沒法繼續執行。
事務的執行過程能夠簡化以下:
因爲數據庫存在當即修改和延遲修改,因此在事務執行過程當中可能存在如下狀況:
數據庫系統是經過併發控制技術和日誌恢復技術來對事務的ACID進行保證的,從而能夠獲得以下的關於數據庫事務的概念體系結構。
+ 系統開始時啓動bios(pc環境中,地址是0xFFFF0),第一階段任務就是上電自檢POST + bios第二階段,本地設備初始化和枚舉,runtime services,做用是檢測順序排在第一的可啓動設備,並啓動存放在設備中的操做系統。(當POST結束時,內存中POST相關代碼會被丟棄,而runtime services代碼一直保存在內存中) + 通常的linux會從磁盤中開始啓動,磁盤的第一個扇區有主引導記錄MBR(Master Boot Record)
前446字節是primary bootloader,包含了可執行代碼和錯誤信息字符串。接下去64字節是磁盤的分區表,該分區表中包含了四條分區記錄,每條分區記錄爲16字節,分區記錄能夠爲空,若爲空則表示分區不存在。最後是2個字節的magic number,這兩個字節是固定的0xAA55,這兩個字節的magic number能夠用於判斷該MBR記錄是否存在。
primary bootloader的做用就是用於尋找並定位secondary bootloader,也就是Stage 2 bootloader。它經過遍歷分區表尋找可用的分區,當它發現可用的分區的時候,仍是會繼續掃描其餘分區,確保其餘分區是不可用的。而後從可用的分區中讀取secondary bootloader到內存中,並執行。