1. 程式人生 > >資料庫原理相關總結

資料庫原理相關總結

資料庫原理

  1. 物理層:作業系統之上,對磁碟檔案系統操作的層,是最底層

  2. 資料庫組織架構核心:

在這裡插入圖片描述

  1. 資料庫系統多程序模式:

在這裡插入圖片描述

在多程序模式中,資料庫系統會為每一個客戶端程序開啟一個DBMS 核心程序,兩個程序之間通過pipe,socket等多種方式進行通訊,一般也稱為會話(session)。

  1. DBMS 多執行緒模式

在這裡插入圖片描述

  1. 資料庫事務
  • 引入事務的主要目的:事務會把資料庫從一種一致狀態轉換為另一種一致狀態,在資料庫提交工作時,可以確保所有修改都儲存了,要麼所有修改都未儲存

  • 事務的ACID:有些資料庫的事務並不嚴格遵循ACID

    • 原子性(Atomicity):整個資料庫事務是不可分割的工作單位。只有事務中的所有操作都執行成功,才算整個事務成功。事務中任何一個sql執行失敗,已經執行成功的sql語句也必須撤銷,資料庫狀態應該退回到執行事務前的狀態
    • 一致性(consistency):一致性指事務將資料庫從一種狀態轉變為下一種一致狀態。在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。或指系統從一個正確的狀態轉到另一個正確的狀態具體參考部落格
    • 隔離性(isolation):隔離性還有其他的稱呼,如併發控制,可序列化,鎖等。事務的隔離性要求讀寫事務的物件對其他事務的操作物件能相互分離,即該事務提交前對其他事務都不可見,通常這使用鎖來實現。
    • 永續性(durability):事務一旦提交,其結果就是永久性的。如當系統發生崩潰,恢復後事務提交的資料也不會丟失。但事務的永續性不是保證系統的高可用性,二是高可靠性,高可用性需要一些系統共同配合來完成
  • 事務的分類:

    • 扁平事務(Flat Transactions):扁平事務是最簡單的一種,也是實際使用中最頻繁的一種。在扁平事務中,所有操作都處於同一層次,其由begin work開始,由commit work 或 rollback work 結束,其間的操作都是原子的,要麼都執行,要麼都回滾。

在這裡插入圖片描述

  • 帶儲存點的扁平事務(Flat Transactions With Savepoint)

    :可以設定回滾的儲存點

  • 鏈事務(Chained Transactions)

  • 巢狀事務(Nested Transactions)

  • 分散式事務(Distributed Transactions)

  • 事務的實現

事務的隔離性是通過鎖來實現,原子性和永續性由redo log實現,一致性由undo log實現

  • 事務控制語句
    • mysql命令列的預設設定下,事務是自動提交的,即執行sql語句馬上執行commit 操作,可以通過set autocommit = 0;來禁用當前會話的自動提交
    • start transaction 和 begin 命令都可以顯示的開啟一個事務,但在儲存過程中只能使用start transaction,因為儲存過程中begin 命令被識別為begin…end。在用start transaction 或 begin 命令顯示開啟事務後,在預設情況下(即completion_type 等於 0)mysql 會自動執行set autocommit = 0命令,並在commit 或 rollback 結束一個事務後,執行set autocommit = 1。 另外,對於不同語言的api,自動提交是不同的,如mysql Python api 會自動執行set autocommit = 0,以禁用自動提交
    • commit [work]:提交
    • rollback [work]:回滾
    • savepoint 儲存點名稱:設定一個儲存點,一個事務中可以有多個savepoint
    • release savepoint 儲存點名稱:刪除一個儲存點
    • rollback to [savepoint] 儲存點名稱:回滾到指定的儲存點
    • set transaction:設定事務的隔離級別,InnoDB儲存引擎的隔離級別有:
      • read uncommitted
      • read committed
      • repeatable read
      • serializable
  • 其他注意事項
    • 長事務,即執行時間比較長的事務,可以分解為若干小事務
  1. mysql 鎖
  • 對某一資源正在進行寫操作時,是不允許對這一資源再進行讀或寫操作的;對某一資源進行讀操作時,可以再對這一資源進行讀操作,但不能再對這一資源進行寫操作

  • 共享鎖(shared lock)即讀鎖;排他鎖(exclusive)即寫鎖

  • 鎖粒度:在給定的資源上,鎖定的資料量越小,鎖定的資料片越精確,則系統的併發程度越高,即效能越高,只要不發生衝突即可;但加鎖也需要消耗資源,鎖的各種操作,包括獲得鎖,檢查鎖是否解除,釋放鎖都會增加系統的開銷。所以要在鎖開銷與併發程度之間取捨

  • 鎖要面對的問題

    • 髒讀:事務A讀取了事務B更新的資料,然後事務B回滾了,那麼事務A讀到的就是髒資料
    • 不可重複讀:事務A多次讀取同一資料,事務B在事務A讀取資料的過程中,更新這一資料並提交,導致事務A兩次讀到的資料不同
    • 幻讀:事務A查詢一張表的記錄數,第一次查詢為a條,期間事務B插入或刪除一條記錄,則事務A第二次查詢到的記錄數則不為a條
    • 丟失更新:事務A與事務B更新同一資源,先更新的結果會被後更新的結果覆蓋

    不可重複讀與幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增刪除,解決不可重複讀鎖定滿足條件的行即可,解決幻讀則需要鎖定表

  1. 其他注意事項
  • mysql5.7 配置檔案為 my.ini

  • 事務隔離級別設定的影響範圍:

    • SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
      
    • 不帶[SESSION | GLOBAL] 時,表示為當前會話的下一個事務設定隔離級別(僅僅是下一個,第二個就不起作用了)

    • 帶[SESSION]時,表示為當前會話的所有事務設定隔離級別

    • 帶[GLOBAL]時,表示設定全域性隔離級別,對設定之後新連線的會話設定預設隔離級別,不會對已經存在的會話有影響,全域性隔離級別的設定不會改變配置檔案中預設的全域性設定,伺服器重啟後按配置檔案重置全域性隔離級別

    • SELECT @@global.tx_isolation; 查詢全域性隔離級別設定
      
    • SELECT @@session.tx_isolation; 
      SELECT @@tx_isolation;
      以上兩種方式都是查詢會話隔離級別設定